Featured image of post 加不加「/」?Nginx location 路径与 proxy_pass 的规律

加不加「/」?Nginx location 路径与 proxy_pass 的规律

近期看到了一张图,列举了nginx的proxy pass和path的关系。经过和朋友讨论,从中发现一些规律。

从一张梗图开始

起源于在TG某个频道看到的一张图:

图下面的评价是:Nginx is so hard!

实际上这张图描述的是nginx location的路径配置,及location代码块中proxy_pass的路径关系,属于nginx应用中路径转发的知识。例如图中Case 1对应的代码块应该为:

1
2
3
location /test1 {
    proxy_pass http://127.0.0.1:8080;
}

其中127.0.0.1:8080是运行的一个后端服务。

例如域名为example.com,那么我在域名后加上Test URL:example.com/test1/abc/test,那么我的后端服务接收到的路径将是:/test1/abc/test

咋一看似乎完全没有规律,其实之前在一些nginx实践中,我个人也深受这个问题的困扰。网上许多文章也并没有详细地解释这个问题。

但把这张梗图和一位朋友交流后,发现了其中的规律。

规律

重点在于proxy_pass URL的IP(域名)、端口后是否有加东西。

如果proxy_pass URL的IP、端口后没加东西

例如:proxy_pass为http://127.0.0.1:8080,属于没加东西的,而http://127.0.0.1:8080/http://127.0.0.1:8080/app1http://127.0.0.1:8080/app1/这些都归为一类,属于有加东西的。

那么,将nginx接收到的URL(即图中的Test URL),原封不动地直接加到proxy_pass URL后面,就成为了后端程序接收到的路径。

图中的Case 1 3 9都是这种情况。

当然,前提是Test URL需要与location后声明的表达式本身匹配。

如果proxy_pass URL的IP、端口后有加东西

即使是加了一个「/」,也叫有加东西。

如果是这种情况,则进行如下操作:

  1. 将nginx接收到的URL(即图中的Test URL)中删掉nginx location的前缀。
  2. 将上一步得到的字符串直接加到proxy_pass URL后面。
  3. 上一步得到的字符串IP、端口后面的部分,就是后端程序接收到的路径。

例如在Case 2中:

Test URL是/test2/abc/test,nginx location是/test2。那么将Test URL中去掉nginx location的部分即为:/abc/test。而proxy_pass URL为http://127.0.0.1:8080/,直接加到这后面,得到http://127.0.0.1:8080//abc/test。取IP、端口后面的部分,为://abc/test。这也就是后端程序接收到的路径中会有两个「/」的原因。

可以自行用这个规律套一下后面几个Case,都能够符合。

Licensed under CC BY-NC-SA 4.0
-1