Nginx 之 location 的匹配優先級

Nginx 配置中的 server 塊中的 location 用來匹配請求 URI,以便對不通的 URI 進行不通的處理。express

location 類型 和 成功匹配的條件

  • location = expression {}   精準匹配,只有 URI 和 expression 徹底相同,纔算匹配成功;
  • location expression {}       普通匹配,只要 URI 前部分的字符與 expression 相同就算匹配成功;
  • location ^~ expression {} 普通匹配,只要 URI 前部分字符與 expression 相同就算匹配成功;
  • location ~ regex {}             正則匹配(區分大小寫);
  • location ~* regex {}           正則匹配(不區分大小寫);

總結可分爲三大類:精準匹配、普通匹配和正則匹配。code

匹配邏輯與優先級

對於一個進入 Nginx 的請求來說,其 URI 可能符合多個 location 的匹配條件,但這條請求最終只會被一個 location 邏輯所處理(重定向不算),那麼,匹配時確定有優先級之分。Nginx 的匹配邏輯是這樣的:server

1. 執行精準匹配

若請求 URI 與 location = 相匹配(符合精準匹配條件),則執行該 location 的內容,再也不進行其餘匹配,不然見下一條。io

2. 執行普通匹配

接下來 Nginx 會將 URI 與全部普通匹配的 location 進行比較(不管是 ^~ 類型仍是無符號類型),而後找出匹配度最高的 location,若該 location^~ 類型,則中止匹配,執行該 location 內容;若匹配度最高的 location 爲無符號類型,則保留這個無符號 location,繼續進行下面的正則匹配;若 URI 不符合任何普通匹配 location 的條件,則直接進入下一步。配置

3. 執行正則匹配

正則的匹配與 location 的順序相關,Nginx 會從上至下進行匹配,若匹配到一個 location,則執行該 location 邏輯,忽略後面全部的正則 location,終止匹配;若一個正則都沒匹配上,則執行以前保留的那個無符號 location,若以前沒有保留,則直接返回 404。請求

相關文章
相關標籤/搜索