侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130555 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

关于proxy_pass的参数路径问题

2023-11-21 星期二 / 0 评论 / 0 点赞 / 24 阅读 / 4156 字

由于工作需要,开始分析nginx的proxy模块,在分析之前,当然要先会用了。于是开始熟悉该模块的一些指令,其中最基本的指令要属proxy_pass了。nginx的英文文档总是看着感觉有些别扭,于是按

由于工作需要,开始分析nginx的proxy模块,在分析之前,当然要先会用了。于是开始熟悉该模块的一些指令,其中最基本的指令要属proxy_pass了。nginx的英文文档总是看着感觉有些别扭,于是按惯例先google了一些文章。

这一搜,就掉进坑里了。

这些文章里都把proxy_pass的目标地址是形如“127.0.0.1:8090”和“127.0.0.1:8090/”分开讨论,认为后者“/"的作用是删除url中匹配的部分,然后再讨论目标地址中带了uri的情况。

其实根本没这么复杂,只有两种情况:

(1)目标地址中不带uri。即proxy_pass的参数形如"http://127.0.0.1:8090"。 此时新的目标url中,匹配的uri部分不做修改,原来是什么样就是什么样。

(2)目标地址中带uri。即proxy_pass的参数形如“http://127.0.0.1:8090/dir1/dir2"

此时新的目标url中,匹配的uri部分将会被修改为该参数中的uri,如"http://127.0.0.1:8888/dir1/dir2."

有人说,你没有讨论ip和端口后带不带”/“的区别。其实是不需要的,因为"/"本身就是一种uri,很明显属于上面的第二种情况,只不过是把原来的uri修改为了现在的uri(”/"),看上去,像是删除了原url中匹配的部分。如果不理解这一点,就会总想着去牢记、区分结尾带不带"/"的情况。 官方文档也是这么叙述的,根本没有提及半句“/":

.

A request URI is passed to the server as follows:

If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive: location /name/ { proxy_pass http://127.0.0.1/remote/; } If proxy_pass is specified without a URI, the request URI is passed to the server in the same form as sent by a client when the original request is processed, or the full normalized request URI is passed when processing the changed URI: location /some/path/ { proxy_pass http://127.0.0.1; }

.

测试部分如下。

如果配置为:

server {                listen 9090;                access/_log /home/strider/project/nginx/nginx-1.4.2/log/access/_9090.log;                location /test1/test2/{                    proxy/_pass http://127.0.0.1:8090;                }           }

则有如下对应关系:

127.0.0.1:9090/test1/test2/echo1----->127.0.0.1:8090/test1/test2/echo1127.0.0.1:9090/test1/test2/---->127.0.0.1:8090/test1/test2

如果配置为:

server {                listen 9090;                access/_log /home/strider/project/nginx/nginx-1.4.2/log/access/_9090.log;                location /test1/test2/{                    proxy/_pass http://127.0.0.1:8090/;                }   }

则有如下对应关系:

127.0.0.1:9090/test1/test2/echo1----->127.0.0.1:8090/echo1127.0.0.1:9090/test1/test2/---->127.0.0.1:8090/

如果配置为:

server {                listen 9090;                access/_log /home/strider/project/nginx/nginx-1.4.2/log/access/_9090.log;                location /test1/test2/{                        proxy/_pass http://127.0.0.1:8090/test1;                }   }

则有如下对应关系:

127.0.0.1:9090/test1/test2/echo1----->127.0.0.1:8090/test1echo1127.0.0.1:9090/test1/test2/---->127.0.0.1:8090/test1

如果配置为:

server {                listen 9090;                access/_log /home/strider/project/nginx/nginx-1.4.2/log/access/_9090.log;                location /test1/test2/{                        proxy/_pass http://127.0.0.1:8090/test3/test4/test5;                }   }

则有如下对应关系:

127.0.0.1:9090/test1/test2/echo1----->127.0.0.1:8090/test3/test4/test5echo1127.0.0.1:9090/test1/test2/---->127.0.0.1:80990/test3/test4/test5

广告 广告

评论区