(10)Nginx proxy_pass 带/和不带区别


nginx配置proxy_pass时url末尾带“/”与不带“/”的区别通过案例说明

tomcat目录

[root@docker-131 ROOT]# pwd
/usr/local/tomcat-7/webapps/ROOT
[root@docker-131 ROOT]# ls
aaa           asf-logo-wide.gif  bg-button.png    bg-nav.png    favicon.ico        tomcat.css  tomcat-power.gif
aaaindex.jsp  bbb                bg-middle.png    bg-upper.png  index.jsp          tomcat.gif  tomcat.svg
asf-logo.png  bbbindex.jsp       bg-nav-item.png  build.xml     RELEASE-NOTES.txt  tomcat.png  WEB-INF
[root@docker-131 ROOT]#

页面index.jsp  aaaindex.jsp bbbindex.jsp   bbb/index.jsp 里面内容都不相同

index.jsp


<%@ pagelanguage="java" %>



  TomcatA

  
        

ip: 192.168.64.131:8080

Session ID: <%= session.getId() %>

 bbbindex.jsp

<%@ pagelanguage="java" %>



  Tomcat131

  

        

ip: 192.168.64.131:8080 bbbindex

aaa/index.jsp

<%@ pagelanguage="java" %>



  Tomcat131

  

        

ip: 192.168.64.131:8080 aaa

bbb/index.jsp

<%@ pagelanguage="java" %>



  Tomcat131

  

        

ip: 192.168.64.131:8080 bbb

nginx配置

upstream test{
        server 192.168.64.131:8080;
}

server {

        listen       80;
         server_name  192.168.64.131;

        #access_log  /var/log/nginx/nginx-tomcat.access.log  main;



         location / {
            root   html;
            index  index.html index.htm;
        }
         #/aaa/ 后面的/最好不要漏掉 
        location /aaa/ {
                proxy_pass http://test/bbb; #只需要改变这里 不断测试
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

 四种情况

不添加目录情况

访问地址(都一样)

http://192.168.64.131/aaa/index.jsp

第一种带/

proxy_pass http://test/  实际代理到这个地址 http://192.168.64.131:8080/index.jsp

第二种不带/

proxy_pass http://test      实际代理到这个地址 http://192.168.64.131:8080/aaa/index.jsp

添加目录情况

第三种带/

proxy_pass http://test/bbb/   实际代理到这个地址http://192.168.64.131:8080/bbb/index.jsp

第四种不带/

proxy_pass http://test/bbb       实际代理到这个地址http://192.168.64.131:8080/bbbindex.jsp

明明访问的ip地址相同 却因为带/ 和不带/ 而产生的页面效果不同 即实际代理地址不同

总结:

1 proxy_pass配置中url末尾带/时,nginx转发时,会将原uri去除location匹配表达式后的内容拼接在proxy_pass中url之后

2 proxy_pass配置中url末尾不带/时,如url中不包含path,则直接将原uri拼接在proxy_pass中url之后;如url中包含path,则将原uri去除location匹配表达式后的内容拼接在 proxy_pass中的url之后。

例如 proxy_pass http://test/  实际代理到这个地址 http://192.168.64.131:8080/index.jsp  代理地址去掉了location 后面的/aaa/

例如 如url中不包含path  proxy_pass http://test           实际代理到这个地址 http://192.168.64.131:8080/aaa/index.jsp  代理地址拼接location 后面的/aaa/

例如 如url中包含path     proxy_pass http://test/bbb   实际代理到这个地址http://192.168.64.131:8080/bbbindex.jsp  代理地址去掉了location 后面的/aaa/  然后拼接在 proxy_pass中的url之后。

参考链接:

https://blog.csdn.net/zhanghui200920061988/article/details/105132167

个人觉得 第四种没必要配置吧  并且只做负载均衡的话 location 后面直接写/ 不加路径 (当然可以写其他的正则表达式) 不是更方便吗