关于nginx的proxy_pass 有无/(根)结尾的区别

Posted @Kerry~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于nginx的proxy_pass 有无/(根)结尾的区别相关的知识,希望对你有一定的参考价值。

对外访问路径是:http://keery.com/proxy/login.html

#情况1
location /proxy/ {
    proxy_pass http://myblog.com:8000/;
}
# proxy_pass的最终地址就是: http://myblog.com:8000/login.html  
# 因为proxy_pass 在端口号后面有以 / 开头的uri,代表绝对路径,所以会忽略匹配到的/proxy/, 直接将/proxy/ 整个从url里面删除.
(URL中:/ 替换 /proxy/ )
转发前:http://keery.com/proxy/login.html

转发后:http://myblog.com:8000/login.html

#情况2
location /proxy/ {
    proxy_pass http://myblog.com:8000;
}
#proxy_pass 代理到 http://myblog.com:8000/proxy/login.html
# 由于后面没有 / 所以 没有替换

转发后路径:http://myblog.com:8000/login.html


#情况3
location /proxy/ {
    proxy_pass http://myblog.com:8000/ymb/;
}
#proxy_pass 代理到http://myblog.com:8000/ymb/login.html
# 因为proxy_pass 在端口号后面有以 /ymb/ 开头的uri,所以 /ymb/ 替换 /proxy/
# /ymb/ = /proxy/ URL 路径上面替换

#情况4
location /proxy/ {
    proxy_pass http://myblog.com:8000/ymb;
}
# proxy_pass 代理到http://myblog.com:8000/ymblogin.html  
# 因为在端口号后面有/ymb 以/开头的uri, 所以会将/proxy/完全替换, 而替换的 /ymb 后面是没有 / 所以是:ymblogin.html 结尾
转发前:http://keery.com/proxy/login.html

转发后:http://myblog.com:8000/ymblogin.html


#情况5
location /proxy {
    proxy_pass http://myblog.com:8000/ymb/;
}
# proxy_pass 代理到http://myblog.com:8000/ymb//login.html  
# 因为在端口号后面有/ymb/ 以/开头的uri,所以会将 /proxy 完全替换 (URL位置上替换 『/proxy』/login.html = 『/ymb/』/login.html) ,可以想象替换后的 URL 是 http://keery.com/ymb//login.html(符号那部分替换)

转发前:http://keery.com/proxy/login.html

转发后:http://myblog.com:8000/ymb//login.html

#情况6
location /proxy {
    proxy_pass http://myblog.com:8000/ymb;
}
#经过我对于情况5 和 情况6的测试 好像两种都是可以正常访问的 对于 login 页面,因为你在后面多拼接 / 对 nginx 来说是无意义的。
例如:
正常:http://keery.com/proxy/login.html

更改:http://keery.com/proxy///login.html (照样正常可以访问的 所以 多 / 无影响)
看下面测试的京东案例

总结:location 后面 匹配的内容,如果是 proxy_pass 路径后面有 / 跟路径的的uri,都是替换掉的。结合对外访问路径看就很容易明白了。只看后面uri部分,前面的域名可以不看。

所有的理解按照下面这个图 替换形式 就没有错了。

测试多个 " / " 对于网站访问的影响

 

http://8.134.70.214:8981/proxy//a.html 记得 在nginx 后面加 多个 / 是毫无帮助的

以上是关于关于nginx的proxy_pass 有无/(根)结尾的区别的主要内容,如果未能解决你的问题,请参考以下文章

nginx里proxy_pass有无/的区别

nginx proxy_pass

nginx 之 proxy_pass详解

Nginx配置proxy_pass转发的/路径问题

nginx location proxy_pass详解

nginx 之 proxy_pass详解