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。