1. 程式人生 > >[整理] Nginx Location 匹配規則

[整理] Nginx Location 匹配規則

目錄

規則語法

語法 匹配規則
普通匹配(遵循最大字首匹配規則, 優先度比正則低)
= 精確(嚴格)匹配
^~ 非正則匹配(依然遵循最大字首匹配規則)
~ 表示區分大小寫的正則匹配
~* 表示不區分大小寫的正則匹配
!~ 和 !~* 別為區分大小寫不匹配及不區分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到

location 分類

只有兩類:正則location和普通location

~~* 為正則location
=^~@和無任何字首的都屬於普通location,另外,@是用作服務端內部的一種轉發行為,很少用,在此不做討論。

匹配順序:

  1. 先普通,再正則
  2. 普通location之間的匹配順序:按最大字首匹配
    location /a/{}location /a/b/ {},請求 http://a/b/c.html 匹配的是 location /a/b/ {}
  3. 正則location之間的匹配順序:按配置檔案中的物理順序匹配,只要匹配到一條正則,就不再考慮後面的
  4. 普通location與正則location之間的匹配結果選擇
    1. 普通location先匹配,匹配到了結果,只是一個臨時結果;
    2. 會繼續正則location的匹配,
      1. 如果匹配到正則,則用匹配到的正則結果;
      2. 如果沒有匹配到正則,則繼續用普通匹配的那個結果

綜上,常規的順序是匹配完普通location,還要繼續匹配正則location,但是,也可以告訴nginx,匹配到了普通location,就不要再搜尋匹配正則location了,通過在普通location前面加上^~

符號,^表示非,~表示正則,^~就是表示不要繼續匹配正則。

除了^~=也可阻止nginx繼續匹配正則,區別在於^~依然遵循最大字首匹配規則,而=是嚴格匹配

擴充套件

location / {}location =/ {}的區別

/ {}作為普通匹配,是遵循最大字首匹配原則的,所以,對於一個url,如果有更特殊合適的匹配,就選特殊合適的,如果沒有更特殊合適的匹配,也有 / {}兜著,就像是預設配置一樣

=/ {} 遵循的是嚴格匹配規則,只能匹配到 http://ip:port/,同時會停止搜尋正則匹配。

如何快速測試

location ~* /a {
        return 999;
    }

直接reuturn 某個數字, 該數字會作為返回的http 狀態碼(自行F12開啟開發者工具檢視)