关于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 有无/(根)结尾的区别的主要内容,如果未能解决你的问题,请参考以下文章