nginx location 優先順位判定(=/^~/~/~*)

複数のlocation定義とテスト用のリクエストパスを入力すると、=(完全一致)・^~(最長前方一致優先)・~/~*(正規表現・定義順)・通常の前方一致という優先順位に従い、各パスがどのlocationに落ちるかを判定理由付きの表で表示します。

リクエストパスマッチした location判定理由

優先順位(nginx公式ドキュメント ngx_http_core_module の location による): ① = 完全一致(一致した時点で即決定)→ ② ^~ 付きの中で最も長く前方一致するもの(一致した時点で正規表現の検査を飛ばして即決定)→ ③ ~(大小文字区別)・~*(区別なし)の正規表現を設定ファイルに書かれた順番に検査し、最初に一致したもの → ④ どの正規表現にも一致しなければ、②で除外した ^~ なしも含めた通常の前方一致の中で最も長いもの、の順に決定されます。

よくある誤解: 正規表現の location(~ / ~*)は「より条件が厳しいもの」や「後に書いたもの」が優先されるわけではなく、あくまで設定ファイルに書いた順番で最初に一致したものが採用されます。一方、通常の前方一致(modifier なし、または ^~)は逆に書いた順番ではなく一致する文字列が最も長いものが優先されます。この2つの優先ルールの違いを混同すると、意図しない location にリクエストが振り分けられます。このツールの正規表現判定は JavaScript の正規表現エンジンで簡易的に行っており、PCRE固有の構文には完全には対応していません。

使い方

  1. nginx の設定ファイルから location の定義行だけを1行ずつ貼り付ける(location ~* \.(png|jpg)$ { のように先頭部分だけでよく、{ は無視される)。
  2. 実際にアクセスされそうなリクエストパスをテスト欄に1行ずつ入力する。
  3. 各パスがどの location にマッチするか、その理由とともに表で表示される。

仕組み・計算式

nginx 公式ドキュメントの ngx_http_core_module(location ディレクティブ)の説明通り、location の選択は次の順で行われる。まず = を付けた完全一致の location を調べ、URIと完全一致すればその時点で検索を終了する。次に、modifier なし、または ^~ を付けた「前方一致」の中から最も長く一致するものを1つ選ぶ。それに ^~ が付いていれば正規表現の検査を行わずそのまま確定する。付いていなければ続けて ~(大小文字を区別)と ~*(区別しない)の正規表現を設定ファイルの記述順に検査し、最初に一致したものを採用する。どの正規表現にも一致しなければ、先ほどの最長の前方一致 location を使用する。

現場の落とし穴:正規表現の location は「より具体的」や「後ろに書いたもの」が優先されるのではなく、記述順で最初に一致したものが採用される。緩い正規表現を先に書くと、後ろのより意図に合う正規表現が評価されないまま終わる。逆に前方一致は記述順ではなく一致する文字列の長さで優劣が決まり、正規表現の「上から順」の直感をそのまま当てはめると誤解になる。^~ 付き前方一致が、後ろに書いた画像拡張子などの正規表現より優先される点も実運用でよく誤解される。

よくある質問

Q. 同じ長さの前方一致 location が複数あるとどうなりますか?

A. nginx の実装は内部的な木構造の走査順に依存するため、設定ファイル上の並び順に頼らずパターンを重複させない設計が望ましい。本ツールでは定義順で先に見つかったものを表示する簡易的な扱いとしている。

Q. location / は必ず必要ですか?

A. 必須ではないが、どの location にも一致しないリクエストの受け皿として location / を用意しておくと、意図しない404を防ぎやすい。

Q. PCRE特有の正規表現構文をこのツールで試せますか?

A. 本ツールはJavaScriptの正規表現エンジンで簡易判定しているため、PCRE固有の構文は正しく評価できない場合がある。基本的な文字クラスや量指定子、$によるパス末尾判定は共通して動作する。

関連ツール

最終更新・根拠の確認日: 2026-09-10 · カテゴリ: Linux・サーバー