對nginx中location的認識


關於一些對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/ {} 。

 

以上就是這次的全部內容!


免責聲明!

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



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