Nginx的location規則:優先順序和路徑替換
Nginx是反向代理和負載均衡的首選工具,nginx的location配置有許多細節內容在網上不容易找到資料,或者解釋不清。本文對locaiton的常見特性進行介紹。
location的優先順序
locaiton有四種型別的匹配規則,分別為完全匹配(=)、字首普通匹配(^~)、正規表示式匹配(~或者~*)、普通匹配
規則
等號型別(=)的優先順序最高。一旦匹配成功,則不再查詢其他匹配項
字首普通匹配(^~)優先順序次之。不支援正規表示式。使用字首匹配,如果有多個location匹配的話,則使用表示式最長的那個
正規表示式型別(~ ~*)的優先順序次之。一旦匹配成功,則不再查詢其他匹配項
常規字串匹配,如果有多個location匹配的話,則使用表示式最長的那個
說明
先判斷精準命中,如果命中,立即返回結果並結束解析過程
若未結束,判斷字首普通命中,如果有多個命中,使用表示式“最長”的命中結果,結束解析過程
若未結束,繼續判斷正規表示式的匹配,按正規表示式順序為準,由上至下一旦匹配成功1個,立即返回結果,並結束解析過程
若未結束,繼續普通命中,普通命中和字首普通命中相似,順序無所謂,按照location表示式的長短來確定命中結果
“最長”命中
^~和普通命中,都是優先使用匹配最長的結果,示例如下:
location ^~ /a {
root /;
}
location ^~ /aaa {
root /aaa;
}
如果url為/aaa,則上面兩個location都匹配成功,但用於location ^~ /aaa較長,所以最終會以/aaa作為root
上例中如果是普通匹配(把location的^~去掉),結果也是一樣的
路徑替換
規則
配置proxy_pass時,可以實現URL路徑的部分替換。
proxy_pass的目標地址,預設不帶/,表示只代理域名,url和querystring部分不會變(把請求的path拼接到proxy_pass目標域名之後作為代理的URL)
如果在目標地址後增加/,則表示把path中location匹配成功的部分剪下掉之後再拼接到proxy_pass目標地址
比如請求 /a/b.html
location /a {
proxy_pass http://server;
}
location /a {
proxy_pass http://server/;
}
如上兩個匹配成功後,實際代理的目標url分別是
http://server/a/b.html (把/a/b.html拼接到http://server之後)
http://server/b.html (把/a/b.html的/a去掉之後,拼接到http://server/之後)
要求
注意的是,對於location為正規表示式的匹配,proxy_pass的目標地址不可以帶/
比如,如下配置會報錯:
location ~ /abc(.*) {
proxy_pass http://127.0.0.1/x;
}
正規表示式的替換
如果是正規表示式,想要實現proxy_pass的路徑替換,可以使用如下方式:
location ~ /abc(.*) { # 注意,使用這種方式,location內部不能包含if語句,否則proxy_pass不會生效
proxy_pass http://127.0.0.1/x$1;
}
如上可以把(.*)所匹配的內容拼接到http://127.0.0.1/abc之後,關於$1的使用,可以參考各種程式語言的正規表示式
另一種方法是:
location /abc { # 這裡也可以是正則
proxy_pass http://127.0.0.1/x$request_uri;
}
相關文章
- nginx location規則優先順序比較Nginx
- 談Nginx的Location匹配優先順序Nginx
- nginx的location匹配順序、優先順序,location對映衝突排查Nginx
- Nginx location 在配置中的優先順序Nginx
- Nginx配置指令location匹配符優先順序和安全問題Nginx
- CSS 選擇器優先順序規則CSS
- 理解C語言宣告的優先順序規則C語言
- nginx快取優先順序Nginx快取
- nginx location匹配規則Nginx
- Nginx Location 路徑匹配Nginx
- Nginx的location配置規則梳理Nginx
- EMC ALUA鏈路優先順序與鏈路切換ON LINUXLinux
- nginx的location 規則匹配練習Nginx
- CSS優先順序CSS
- nginx location匹配及rewrite規則Nginx
- HttpClient和HttpGet 引數的優先順序HTTPclient
- 高效能Web伺服器Nginx的配置與部署研究(16)小議location匹配模式優先順序Web伺服器Nginx模式
- scala隱式轉換優先順序問題
- html優先順序和層疊性HTML
- 中斷優先順序
- Nginx location 和 proxy_pass路徑配置詳解Nginx
- python運算子及優先順序順序Python
- [譯]HTTP/2的優先順序HTTP
- CSS的處理優先順序CSS
- gc current block busy和LMS優先順序GCBloC
- Android程式優先順序Android
- SQL 優先順序join>whereSQL
- java運算子優先順序Java
- php運算子優先順序PHP
- css優先順序彙總CSS
- CSS規則的執行順序CSS
- 如何在Mac上更改WiFi網路的優先順序 ?MacWiFi
- toString()和valueOf()函式呼叫和優先順序函式
- css選擇器的優先順序CSS
- 警惕執行緒的優先順序執行緒
- 併發請求的優先順序
- [勝通]程式優先順序和程式nice值?
- 正規表示式的用途語法與優先順序(/應為\)