Nginx 之 location 的匹配優先級

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

location 類型 和 成功匹配的條件

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

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

匹配邏輯與優先級

對於一個進入 nginx 的請求來講,其 uri 可能符合多個 location 的匹配條件,但這條請求最終只會被一個 location 邏輯所處理,那麼,匹配時肯定有優先級之分。nginx 的匹配邏輯是這樣的:

1. 執行精準匹配

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

2. 執行普通匹配

接下來 nginx 會將 uri 與所有普通匹配的 location 進行比較(無論是 ^~ 類型還是無符號類型),然後找出匹配度最高的 location,若該 location 爲 ^~ 類型,則停止匹配,執行該 location 內容;若匹配度最高的 location 爲無符號類型,則保留這個無符號 location,繼續進行正則的匹配;若 uri 不符合任何普通匹配 location 的條件,則直接進入下一步。

3. 執行正則匹配

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章