關於一些對location認識的誤區
1.location的匹配順序是“先匹配正則,在匹配普通”。
location的匹配順序其實是“先匹配普通,在匹配正則”。造成誤解的原因是:正則匹配會覆蓋普通匹配
2.location的執行邏輯跟location的編輯順序無關
a. “普通location”的匹配規則是“最大前綴”,因此“普通location”的確與編輯順序無關;
但是“正則location”的匹配規則是“順序匹配”,且只要匹配到第一個就停止后面的匹配。
b.“普通location ”與“正則 location ”之間的匹配順序是,先匹配普通 location ,再“考慮”匹配正則 location 。
注意這里的“考慮”是“可能”的意思,也就是說匹配完“普通 location ”后,有的時候需要繼續匹配“正則 location ”,有的時
候則不需要繼續匹配“正則 location ”。
兩種情況下不需要繼續匹配正則location:
(1)當普通location的前面指定了“^~”,特別告訴nginx本條普通location一旦匹配上,則不需要繼續匹配。
(2)當普通location恰好嚴格匹配上,不是最大前綴匹配,則不再繼續匹配正則
總結: “正則 location 匹配讓步普通 location 的嚴格精確匹配結果;但覆蓋普通 location 的最大前綴匹配結果”
3.location的語法
location [ = | ~ | ~* | ^~ | @] /uri/ {...}
根據不同前綴“=”,“~*”,“^~”,“@”和不帶任何前綴,表達的含義不同
總結:盡管location 的/uri/ 配置一樣,但前綴不一樣,表達指令含義不同。
4.location前綴的詳細說明
主要分為兩大類:正則location和普通location
正則location “~”和“~*”:
“~”表示區分大小寫;“~*”表示不區分大小寫
普通location 除了上面其余全是(包括沒有前綴) “=”,“^~”,“@”
“^~”中的“^”表示非,“~”表示正則,意思為不要繼續匹配正則
“=”也表示阻止正則location,和“^~”的區別為:“^~”依然遵守“最大前綴”匹配;而“=”必須是嚴格匹配。
還有一種“隱含”的方式來阻止正則location 的搜索:當“最大前綴”匹配恰好就是一個“嚴格精確(exact match )”匹
配,照樣會停止后面的搜索。意思是:只要遇到“精確匹配exact match ”,即使普通location 沒有帶“= ”或“^~ ”前
綴,也一樣會終止后面的匹配。
“@ ”是用來定義“Named Location ”的(可以理解為獨立於“普通location”和“正則location”之外的第三種類型),這種“Named Location ”不是用來處理普通的HTTP 請求的,它
是專門用來處理“內部重定向(internally redirected )”請求的。
注意:這里說的“內部重定向(internally redirected )”是不需要跟瀏覽器交互的,純粹是服務端的一個轉發行為。
5.location的匹配原則 最大前綴匹配
例如:
location /prefix/mid/ {} 和location /prefix/ {} ,
對於HTTP 請求/prefix/mid/t.html ,前綴匹配的話兩個location 都滿足,選哪個?
原則是:the most specific match ,於是選的是location /prefix/mid/ {} 。
以上就是這次的全部內容!