[整理] Nginx Location 匹配規則
阿新 • • 發佈:2018-12-07
目錄
規則語法
語法 | 匹配規則 |
---|---|
空 | 普通匹配(遵循最大字首匹配規則, 優先度比正則低) |
= | 精確(嚴格)匹配 |
^~ | 非正則匹配(依然遵循最大字首匹配規則) |
~ | 表示區分大小寫的正則匹配 |
~* | 表示不區分大小寫的正則匹配 |
!~ 和 !~* | 別為區分大小寫不匹配及不區分大小寫不匹配 的正則 |
/ | 通用匹配,任何請求都會匹配到 |
location 分類
只有兩類:正則location和普通location
~
和 ~*
為正則location
=
、^~
、@
和無任何字首的都屬於普通location,另外,@
是用作服務端內部的一種轉發行為,很少用,在此不做討論。
匹配順序:
- 先普通,再正則
- 普通location之間的匹配順序:按最大字首匹配
如location /a/{}
,location /a/b/ {}
,請求 http://a/b/c.html 匹配的是location /a/b/ {}
- 正則location之間的匹配順序:按配置檔案中的物理順序匹配,只要匹配到一條正則,就不再考慮後面的
- 普通location與正則location之間的匹配結果選擇
- 普通location先匹配,匹配到了結果,只是一個臨時結果;
- 會繼續正則location的匹配,
- 如果匹配到正則,則用匹配到的正則結果;
- 如果沒有匹配到正則,則繼續用普通匹配的那個結果
綜上,常規的順序是匹配完普通location,還要繼續匹配正則location,但是,也可以告訴nginx,匹配到了普通location,就不要再搜尋匹配正則location了,通過在普通location前面加上^~
^
表示非,~
表示正則,^~
就是表示不要繼續匹配正則。
除了^~
,=
也可阻止nginx繼續匹配正則,區別在於^~
依然遵循最大字首匹配規則,而=是嚴格匹配
擴充套件
location / {}
和 location =/ {}
的區別
/ {}
作為普通匹配,是遵循最大字首匹配原則的,所以,對於一個url,如果有更特殊合適的匹配,就選特殊合適的,如果沒有更特殊合適的匹配,也有 / {}
兜著,就像是預設配置一樣
=/ {}
遵循的是嚴格匹配規則,只能匹配到 http://ip:port/,同時會停止搜尋正則匹配。
如何快速測試
location ~* /a {
return 999;
}
直接reuturn 某個數字, 該數字會作為返回的http 狀態碼(自行F12開啟開發者工具檢視)