トピック

Nginx location マッチングルール解説

  • このエントリーをはてなブックマークに追加

Nginx の location ディレクティブは、リクエストされた URI をどのように処理するかを決定する重要な設定です。 複数の location がある場合、どのブロックが選ばれるかは特定のルールに従います。

location の種類

プレフィックスマッチ(無印)

location /images/ { ... }
  • URI が /images/ で始まるリクエストにマッチ。
  • 最長一致ルールが適用される。
  • 正規表現ロケーションより優先度は低い。

厳密一致(=)

location = /exact/path { ... }
  • URI が完全一致したときのみ適用。
  • 最優先でマッチする。

正規表現マッチ(~)

location ~ \.php$ { ... }
  • 正規表現に基づいたマッチング。
  • 大文字・小文字を区別する。

正規表現マッチ(~*)

location ~* \.(jpg|jpeg|png)$ { ... }
  • 正規表現に基づいたマッチング。
  • 大文字・小文字を区別しない。

強制プレフィックスマッチ(^~)

location ^~ /static/ { ... }
  • URI が /static/ で始まればマッチ。
  • この場合、正規表現ロケーションの評価をスキップして確定する。
  • 正規表現より優先的に処理させたいときに有効。

マッチングの優先順位

Nginx が location を選ぶ流れは次の通りです。

  1. **=(厳密一致)**があればそれを採用
  2. **プレフィックスマッチ(無印 / ^~)**から最長一致を探す
  3. この候補が ^~ なら確定(正規表現は無視)
  4. **正規表現ロケーション(~ / ~*)**を設定順に評価
  5. 最初にマッチしたものを採用
  6. 正規表現にマッチしなければ、2 のプレフィックス最長一致を採用

実例

location /images/ { ... }               # プレフィックス
location ^~ /images/icons/ { ... }      # 強制プレフィックス
location ~* \.(gif|jpg|png)$ { ... }    # 正規表現
  • リクエスト /images/icons/logo.png
    ^~ /images/icons/ にマッチし、正規表現は無視される。
  • リクエスト /images/photo.jpg
    /images/ が候補だが、正規表現 ~* \.(gif|jpg|png)$ もマッチ
    → 正規表現が優先される。

パフォーマンスとベストプラクティス

  • プレフィックスマッチを優先して使う
    正規表現は柔軟だが CPU コストが高い。^~ を活用すると効率的。
  • 正規表現は必要最小限に
    拡張子チェックや特殊なルーティングに絞る。
  • わかりやすい設計にする
    プレフィックスと正規表現が混在すると可読性が下がるので、意図を明確に。

まとめ

  • =:完全一致、最優先。
  • ^~:プレフィックスで確定、正規表現を無視。
  • 無印:通常のプレフィックス、最長一致。
  • ~:正規表現(大文字区別)。
  • ~*:正規表現(大文字区別なし)。

原則は プレフィックスで表現できるものはプレフィックスを使い、正規表現は最小限に使用するといいです。

  • このエントリーをはてなブックマークに追加

コメントを残す


*

CAPTCHA