nginx location 以及 proxy_pass 的幾種情況 以/結尾的問題


工作中遇到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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM