1. 程式人生 > 其它 >一文讀懂nginx location匹配

一文讀懂nginx location匹配

location的指令分為兩種匹配模式 :

  • 普通字串匹配
  • 正則匹配

普通匹配包含三種格式:

修飾符 參考示例 說明
location /hello/world 字首匹配,不支援正則
= location = /hello/world 又叫精確匹配,不支援正則
^~ location ^~ /hello/world 字首匹配,不支援正則

正則表示式匹配包含兩種格式:

修飾符 參考示例 說明
~ location ~ .jpg$ 區分大小寫的正則匹配,是包含匹配,而非字首匹配
~* location ~* .jpg$ 不區分大小寫的正則匹配,是包含匹配,而非字首匹配

location匹配順序

關於location匹配的一些誤區

轉自:https://www.cnblogs.com/lidabo/p/4169396.html

1、 location 的匹配順序是“先匹配正則,再匹配普通”。

矯正: location 的匹配順序其實是“先匹配普通,再匹配正則”。我這麼說,大家一定會反駁我,因為按“先匹配普通,再匹配正則”解釋不了大家平時習慣的按“先匹配正則,再匹配普通”的實踐經驗。這裡我只能暫時解釋下,造成這種誤解的原因是:正則匹配會覆蓋普通匹配。

2、 location 的執行邏輯跟 location 的編輯順序無關。

矯正:這句話不全對,“普通 location ”的匹配規則是“最大字首”,因此“普通 location ”的確與 location 編輯順序無關;但是“正則 location ”的匹配規則是“順序匹配,且只要匹配到第一個就停止後面的匹配”;“普通location ”與“正則 location ”之間的匹配順序是?先匹配普通 location ,再“考慮”匹配正則 location 。注意這裡的“考慮”是“可能”的意思,也就是說匹配完“普通 location ”後,有的時候需要繼續匹配“正則 location ”,有的時候則不需要繼續匹配“正則 location ”。兩種情況下,不需要繼續匹配正則 location :( 1 )當普通 location 前面指定了“ ^~ ”,特別告訴 Nginx 本條普通 location 一旦匹配上,則不需要繼續正則匹配;( 2 )當普通location 恰好嚴格匹配上,不是最大字首匹配,則不再繼續匹配正則。

總結一句話: “正則 location 匹配讓步普通 location 的嚴格精確匹配結果;但覆蓋普通 location 的最大字首匹配結果”