Skip to content

建立 2026-09-15 更新 2026-09-15

location 規則與比對順序

location 決定同一個網站底下,不同網址路徑要交給哪一段設定處理。它的語法簡單,但比對順序卻是新手最常誤解的地方——不是由上到下比對,命中就用,而是有固定的優先順序規則。

location 的修飾符

寫法 名稱 說明
location /path {} 前綴匹配 比對開頭是否符合,比對到「最長」的前綴會勝出
location = /path {} 精確匹配 網址必須完全相同才符合,優先度最高
location ^~ /path {} 優先前綴 一旦前綴符合,直接採用,不再往下比對正則
location ~ /pattern {} 正則匹配(區分大小寫) 用正規表示式比對
location ~* /pattern {} 正則匹配(不分大小寫) 同上,但忽略大小寫

比對優先順序

Nginx 收到請求後,實際的比對順序是:

  1. 精確匹配 =:完全相同就直接使用,比對結束。
  2. 前綴匹配找出最長的一個:如果該前綴有加上 ^~,就直接採用這個結果,不會再往下比對正則。
  3. 若第 2 步找到的最長前綴沒有 ^~,才會依照設定檔中的書寫順序,逐一測試正則(~~*),第一個相符的就採用。
  4. 如果所有正則都不符合,就退回第 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「這個前綴一旦符合就不用再比對正則了」。