(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 后面直接写/ 不加路径 (当然可以写其他的正则表达式) 不是更方便吗