在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。

 

下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。

第一种:

location  /proxy/ {

          proxy_pass http://127.0.0.1:81/;

}

会被代理到http://127.0.0.1:81/test.html 这个url

 

第二咱(相对于第一种,最后少一个 /)

location  /proxy/ {

          proxy_pass http://127.0.0.1:81;

}

会被代理到http://127.0.0.1:81/proxy/test.html 这个url

 

第三种:

location  /proxy/ {

          proxy_pass http://127.0.0.1:81/lzn/;

}

会被代理到http://127.0.0.1:81/lzn/test.html 这个url。

 

第四种情况(相对于第三种,最后少一个 / ):

location  /proxy/ {

          proxy_pass http://127.0.0.1:81/lzn;

}

会被代理到http://127.0.0.1:81/lzntest.html 这个url

 

上面的结果都是本人结合日志文件测试过的。从结果可以看出,应该说分为两种情况才正确。即http://127.0.0.1:81 (上面的第二种) 这种和 http://127.0.0.1:81/.... (上面的第1,3,4种) 这种。

 

 

-----------------------------------------------------------------------------------------

nginx proxy_pass末尾神奇的/

http://backend;和http://backend/;有什么区别呢?

        location /service/ {
            proxy_pass   http://backend;
            proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
        }

        location /service/ {
            proxy_pass   http://backend/;
            proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
        }
同样访问:http://www.linzhennan.cn/service/add.php
前者配置,在后端的机器,收到的是http://www.linzhennan.cn/service/add.php
后者配置,在后端的机器,收到的是http://www.linzhennan.cn/add.php

如果换成下面这样,会报错:
        location ~ ^/(service)/ {
            proxy_pass   http://backend/;
            proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
        }
"proxy_pass" may not have URI part in location given by regular expression, or inside named location, or inside the "if" statement, or inside the "limit_except" block in nginx.conf:

但是,这样就没问题了:
        location ~ ^/(service)/ {
            proxy_pass   http://backend;
            proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
        }
把proxy_pass末尾的斜线去掉,就可以了。