工作中遇到nginx的location 和proxy_pass 有無/(根)結尾的區別
在location中匹配的url最后有無/結尾,指的是模糊匹配與精確匹配的問題
在proxy_pass中代理的url最后有無/結尾(不能作為判斷依據),指的是在proxy_pass 指定的url后要不要替換掉location里面匹配到的字符串
單純從proxy_pass的問題上來說, 不能以有沒有/結尾來判斷, 而是以有沒有uri來判斷.
只要在 域名:端口 后面加上了任何以/開頭的字符串, 就被視為有uri, 規則就會發生改變. 有uri就會把請求的uri拼到proxy_pass的url后面, 然后整個替換掉location里面匹配的字符串.
舉例如下
1)沒有"/"結尾時,location /abc/def 可以匹配/abc/defghi的請求,也可以匹配/abc/def/ghi ...... 2)有"/"結尾時,location /abc/def/ 不能匹配/abc/defghi的請求,只能精確匹配 /abc/def/ghi這樣的請求
proxy_pass舉例如下:
#情況1 location /proxy/ { proxy_pass http://myblog.com:8000/; } # proxy_pass的最終地址就是: http://myblog.com:8000/login.html # 因為proxy_pass 在端口號后面有以/開頭的uri,代表絕對路徑,所以會忽略匹配到的/proxy/, 直接將/proxy/ 整個從url里面刪除. #情況2 location /proxy/ { proxy_pass http://myblog.com:8000; } #proxy_pass 代理到 http://myblog.com:8000/proxy/login.html #情況3 location /proxy/ { proxy_pass http://myblog.com:8000/disquz/; } #proxy_pass 代理到http://myblog.com:8000/disquz/login.html #情況4 location /proxy/ { proxy_pass http://myblog.com:8000/disquz; } # proxy_pass 代理到http://myblog.com:8000/disquzlogin.html # 因為在端口號后面有/disquz 以/開頭的uri, 所以會將/proxy/完全替換, 故/proxy/login.html 只剩下login.html 拼在url后面就會成為http://myblog.com:8000/disquzlogin.html #情況5 location /proxy { proxy_pass http://myblog.com:8000/disquz/; } # proxy_pass 代理到http://myblog.com:8000/disquz//login.html # 因為匹配到了這個規則 所以把uri里面的/proxy去掉 剩下/login.html, 拼在url后面就是http://myblog.com:8000/disquz//login.html