nginx是由俄罗斯开发的一款http web服务器,我们经常用这款服务器做负载均衡和反向代理。
今天我们就来聊聊Nginx作为反向代理时,如何进行路由配置。
假设你已经部署好Nginx了,我们进入Nginx安装目录,进入nginx.conf文件。
找到http节点下的server节点,值是一个json。
在json中 有一个location的指令,就是代表转发。
一般是这样的形式:

location {$path} {
proxy_pass {$url};
}

{$path}代表匹配源url的部分,proxy_pass 后的{$url}则是代表要转发的目标url,

这里一般会涉及到转发时是否携带原有路径的问题。举个例子:

location /abc {
proxy_pass http://127.0.0.1:9090/;
}

如果我们请求 http://127.0.0.1:80/abc (假设nginx的服务器的是80)

则请求的路径path是/abc,此时会匹配到该location指令的规则 /abc,则请求会转发的本机的9090端口。
如果我们请求 http://127.0.0.1:80/abc/cloud
则请求的路径path是/abc/cloud,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )此时会匹配到该location指令的规则,则请求会转发的本机的9090端口。
但是问题来了,转发9090端口时,/abc要不要补充到后边?后边的/cloud部分要不要追加?
这里是和$url是否包含路径有关系,无斜杠就代表不包含路径,有斜杠就代表包含路径。

一、

如果:$url为http://127.0.0.1:9090 表示无路径
此种情况,会将源url的路径部分直接追加
举几个例子
(1)

location /abc {
proxy_pass http://127.0.0.1:9090;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/abc/bcd
(2)

location /abc/bcd {
proxy_pass http://127.0.0.1:9090;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/abc/bcd
(3)

location /abc/bcd/ {
proxy_pass http://127.0.0.1:9090;
}

请求http://127.0.0.1:80/abc/bcd/

则跳转到http://127.0.0.1:9090/abc/bcd/

总结就是一句话,proxy_pass 后配置的目标url,如果没有路径信息(包括/),则会将源url的路径部分,直接追加到目标url中

二、

如果:$url为http://127.0.0.1:9090/ 表示有路径
如果:$url为http://127.0.0.1:9090/gov 表示有路径
如果:$url为http://127.0.0.1:9090/gov/ 表示有路径
此种情况,会将源url的路径部分去掉已匹配部分后,将剩余部分直接追加到目标url后,如图:

举几个例子

(1)

location /abc/ {
proxy_pass http://127.0.0.1:9090/;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/bcd
分析:
源url的路径部分是: “/abc/bcd”
与匹配规则“/abc/”匹配成功
匹配后剩余部分是“bcd”“http://127.0.0.1:9090/”追加“bcd”
则最终会跳转到http://127.0.0.1:9090/bcd
(2)

location /abc {
proxy_pass http://127.0.0.1:9090/gov;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/gov/bcd
(3)

location /abc/b {
proxy_pass http://127.0.0.1:9090/gov/;
}

请求http://127.0.0.1:80/abc/bcd/

则跳转到http://127.0.0.1:9090/gov/cd/
(4)

location /abc/b {
proxy_pass http://127.0.0.1:9090/gov/;
}

请求http://127.0.0.1:80/abc/b/cd/

则跳转到http://127.0.0.1:9090/gov//cd/

总结就是一句话,proxy_pass 后配置的目标url,如果有路径信息(包括/),则会将源url的路径部分匹配后剩余的部分路径,直接追加到目标url中

现在还有一个问题就是,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )如果有多个匹配规则都命中的话,那么nginx会怎么处理呢?

如下:

location / {
proxy_pass http://127.0.0.1:9091/gov/;
}
location /abc {
proxy_pass http://127.0.0.1:9092/gov/;
}
location /abc/ai {
proxy_pass http://127.0.0.1:9093/gov/;
}

请求http://127.0.0.1:80/abc/ai/

则nginx 会按照最大匹配原则的情况,选择匹配对象,此时就会将请求转发至9093端口

Nginx服务器配置---反向代理服务时proxy_pass的转发规则的更多相关文章

  1. 【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置

    > 参考的优秀文章 Module ngx_http_proxy_module > 设置等待被代理服务器的最大响应时间 使用Nginx做反向代理时,因被代理服务器因业务确实复杂,需时较久,往 ...

  2. 如何取得nginx做反向代理时的真实IP?

    1. 编译 对于client -> nginx reverse proxy -> apache, 要想在程序中取得真实的IP,在执行nginx的configure时,必须指定参数" ...

  3. nginx做反向代理时获取真实IP

    原文:http://blog.csdn.net/aquester/article/details/48657395 1. 编译 对于client -> nginx reverse proxy - ...

  4. nginx做反向代理时出现302错误

    现象:nginx在使用非80端口做反向代理时,浏览器访问发现返回302错误 详细现象如下: 浏览器请求登录页: 输入账号密码点击登录: 很明显登录后跳转的地址少了端口号. 原因:proxy.conf文 ...

  5. nginx做反向代理时出现302错误(转载)

    现象:nginx在使用非80端口做反向代理时,浏览器访问发现返回302错误 详细现象如下: 浏览器请求登录页: 输入账号密码点击登录: 很明显登录后跳转的地址少了端口号. 原因:proxy.conf文 ...

  6. Nginx作为反向代理时传递客户端IP的设置方法

    因为nginx的优越性,现在越来越多的用户在生产环境中使用nginx作为前端,不管nginx在前端是做负载均衡还是只做简单的反向代理,都需要把日志转发到后端real server,以方便我们检查程序的 ...

  7. Nginx http反向代理流程Proxy_pass模块

    L:88 反向代理代码示列 server { listen ; server_name shop**.com.cn; location /{ proxy_pass http://test/www; p ...

  8. nginx的proxy_pass路径转发规则浅析(末尾/问题)

    源地址 : https://www.zifangsky.cn/917.html 一 location匹配路径末尾没有 / 此时proxy_pass后面的路径必须拼接location的路径:   1 2 ...

  9. (转)FIKKER和Nginx的反向代理服务功能对比评测报告

    转自:http://tieba.baidu.com/p/1268737304 针对高并发反向代理服务器 NGINX和FIKKER评测报告 测试硬件环境:服务端:CPU:E5200硬盘:SATA 133 ...

  10. Nginx做代理路由时,不转发http的header问题

    从header里面拿不到 TX_XID这种类型的字段, Nginx 会默认忽略含有 “_” 的 header 参数,而 TX_XID值的参数名恰好含有 “_” 符号,需要手动开启转发. 在 nginx ...

随机推荐

  1. 关于封装axios报错Cyclic dependency的问题

    在npm start的时候直接报错Cyclic dependency循环依赖 JS 循环依赖 (require cycle)_腾飞日记-CSDN博客_js循环依赖 可以看上面的博文了解一下这个错大概在 ...

  2. 【Appium】之自动化定位总结

    一.同级定位时,先定位上级 我想定位[必填]框,我先定位[姓名]的同一个上级 self.driver.find_element(MobileBy.XPATH,"//*[contains(@t ...

  3. 一篇文章讲清楚Java中的反射

    介绍 每个类都有一个 Class 对象,包含了与类有关的信息.当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象. 类加载相当于 Class 对象的加载.类在第 ...

  4. IVIEW 评分组件 Rate 介绍

    1. 首先,评分允许评半颗星,使用 allow-half <template> <Rate allow-half v-model="valueHalf" /> ...

  5. vue动态绑定样式

    每次点击方块时通过三元表达式,改变对应的class,每一个不同的class对应不同的样式,从而通过改变class实现样式的切换. 实现代码 <template> <div class ...

  6. dotnet 读 WPF 源代码笔记 从 WM_POINTER 消息到 Touch 事件

    本文记录我读 WPF 源代码的笔记,在 WPF 底层是如何从 Win32 的消息循环获取到的 WM_POINTER 消息处理转换作为 Touch 事件的参数 由于 WPF 触摸部分会兼顾开启 Poin ...

  7. QT原理与源码分析之QT反射机制原理

    QT反射机制原理 本文将介绍QT反射机制创建QT对象实例的原理和流程以及源代码. 文章目录 QT反射机制创建QT对象实例 原理 流程 源码 QT反射机制创建QT对象实例 QT框架提供的基于元对象的反射 ...

  8. AD域下,环境下办公机系统时间不准确

    事件起因: 某部门一同事电脑时间和AD域控时间相差3分钟,虽然说时间相差5分钟内问题不大,但是本着有问题就解决的原则,还是花了点时间去查资料解决. (小小吐槽一下,在我看来域控机是掌管下面所有的办公机 ...

  9. 16 模块time、datetime、random、hashlib、logging

    1. 时间模块time.datetime 在python中,表示时间有三种方式:时间戳 格式化的时间字符串(Format String): '2022-03-01' 时间元组(struct_time) ...

  10. Lazy TLB Mode 的工作原理

    Lazy TLB (Translation Lookaside Buffer) mode 是操作系统和处理器在管理虚拟内存时的一种优化技术,旨在提高处理器的性能.要理解 Lazy TLB mode,需 ...