談Nginx的Location匹配優先順序

2022-06-21 22:54:10 字數 2087 閱讀 8161

nginx的配置檔案中的location用於匹配特定的uri,如果location後面的規則匹配了uri,並且匹配在此處停止向後匹配,則應用該location下面的規則,反之繼續進行匹配,直到匹配到相應的規則或匹配到預設的規則。

這篇文章單就location的定位進行討論,其它的部分不進行解析。

location為什麼重要?

location 相當於選擇,選中。當我們處理某件事情,往往必須選中,然後再進行進一步的動作。比如處理word時,對某段文字應用字型,肯定是先選中,然後再應用規則。location就是這個意思,選擇的物件就是uri,根據不同的uri,使用不同的規則,location就是第一步,只有這一步正確,其餘的部分才能保證順利進行。

location該如何配置?

location的幾種匹配方式

普通匹配:

location = uri #精確匹配

location ^~ uri #非正則匹配

location [space] uri # # 字首匹配

正則匹配

location ~ uri #大小寫敏感匹配

location ~* uri #大小寫不敏感匹配

幾種匹配方式的優先順序

整體規則按照先普通匹配,然後再正則匹配,如果正則不匹配,則回退至上乙個普通匹配。其中普通匹配沒有順序之分,哪個匹配最精確,就使用哪個location,正則匹配按照規則的書寫順序進行。

= 精確匹配,匹配後停止後續匹配,直接執行該匹配後的configuration.

[空格] 字首匹配,匹配後,繼續更長字首匹配和正則匹配。

^~ 非正則匹配,匹配該規則後,停止繼續正則匹配。

~ 區分大小寫的正則匹配,按順序匹配,一旦匹配上即停止後續匹配。

~* 不區分大小寫的匹配,一旦匹配即停止後續匹配。

幾種匹配規則的相同點和不同點

首先對幾種匹配符號進行編號:

符號編號=1

空格2^~3

~4~*5

1 vs 2

相同點: 2的特殊情況(隱式精確匹配)會等於1 

不同點: 1匹配後停止後續的正則匹配,2 匹配後還要看有沒有更長的字首可以匹配,和有沒有後續的正則匹配。

1 vs 3

相同點:都停止後續的正則匹配,即即使有正規表示式可以匹配的上,也不會匹配。

不同點: 3 匹配後還要繼續進行最大字首匹配,如果有更精確的匹配可以用,就使用該條匹配。

1 和 4 5 是兩類不同的匹配方式,匹配了1 就意味著,45都忽略。

2 vs 3 :

相同點:匹配後都執行最大字首匹配,

不同點: 2 進行最大字首匹配後還要進行正則匹配,3 匹配後停止正則匹配。

示例:如果uri相同,則location /test 和 location ^~ /test  相同,報錯如下:

nginx: [emerg] duplicate location "/test" in /data/nginx/conf/nginx.conf:42

由此可見, ^~ 和 空格 在uri相同的情況下,是同樣的意思,所以報如上錯誤。

演示:在以下路徑中

/data/nginx/zzp/exact/

/data/nginx/zzp/regex/

建立同名但不同內容的檔案,然後使用curl -v http://host/a.html

發現,正規表示式部分會生效,由此證明,經過普通匹配後的uri,再繼續進行regex匹配,regex匹配上之後,regex生效。

location  /zzp/

location ~ ^/zzp/(.*\.html)$

使用取消正規表示式符號 ^~,然後再請求相同的鏈結,發現exact路徑下的檔案被訪問,證明,普通匹配執行後不再進行正規表示式匹配。

location ^~ /zzp/

location ~ ^/zzp/(.*\.html)$

nginx的location配置詳解

語法規則 location uri 開頭表示精確匹配 開頭表示uri以某個常規字串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為 static 20 aa,可以被規則 static aa匹配到 注意是空格 開頭表示區分大小寫的正則匹配 開頭表示不區分大小寫的正則匹配 和 分...

nginx的location配置詳解

語法規則 location uri 開頭表示精確匹配 開頭表示uri以某個常規字串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為 static 20 aa,可以被規則 static aa匹配到 注意是空格 開頭表示區分大小寫的正則匹配 開頭表示不區分大小寫的正則匹配 和 分...

nginx的location規則(一)

nginx的url配置是使用nginx最基本功能。nginx作為伺服器,它可以接收請求,處理請求,都是基於客戶端url訪問。掌握url的配置要了解配置的幾個指令。熟悉每個匹配模式的特點。之前對於nginx的location匹配規則,我是一塌糊塗,最近認真學了一下,稍微清晰一點了,先記錄下來,方便以後...