location 規則與比對順序
location 決定同一個網站底下,不同網址路徑要交給哪一段設定處理。它的語法簡單,但比對順序卻是新手最常誤解的地方——不是由上到下比對,命中就用,而是有固定的優先順序規則。
location 的修飾符
| 寫法 | 名稱 | 說明 |
|---|---|---|
location /path {} |
前綴匹配 | 比對開頭是否符合,比對到「最長」的前綴會勝出 |
location = /path {} |
精確匹配 | 網址必須完全相同才符合,優先度最高 |
location ^~ /path {} |
優先前綴 | 一旦前綴符合,直接採用,不再往下比對正則 |
location ~ /pattern {} |
正則匹配(區分大小寫) | 用正規表示式比對 |
location ~* /pattern {} |
正則匹配(不分大小寫) | 同上,但忽略大小寫 |
比對優先順序
Nginx 收到請求後,實際的比對順序是:
- 精確匹配
=:完全相同就直接使用,比對結束。 - 前綴匹配找出最長的一個:如果該前綴有加上
^~,就直接採用這個結果,不會再往下比對正則。 - 若第 2 步找到的最長前綴沒有
^~,才會依照設定檔中的書寫順序,逐一測試正則(~/~*),第一個相符的就採用。 - 如果所有正則都不符合,就退回第 2 步找到的最長前綴匹配結果。
範例對照
server {
location / {
# 4. 最後的備援:符合任何路徑
root /var/www/html;
}
location /images/ {
# 2. 一般前綴匹配
root /var/www;
}
location ^~ /static/ {
# 2. 優先前綴:符合就直接用,跳過下面的正則
root /var/www;
}
location ~* \.(jpg|png|gif)$ {
# 3. 正則匹配:處理圖片副檔名的快取設定
expires 30d;
}
location = /health {
# 1. 精確匹配:健康檢查端點,優先度最高
return 200 "ok";
}
}
以請求 /static/logo.png 為例:雖然它同時符合 ^~ /static/ 與正則 \.(jpg|png|gif)$,但因為最長前綴 /static/ 有 ^~,Nginx 會直接採用該規則,完全不會去測試下面的正則規則。這正是 ^~ 存在的目的:明確告訴 Nginx「這個前綴一旦符合就不用再比對正則了」。