Skip to content

nginx location テスター — なぜそのブロックが勝つのか

どの nginx location ブロックが選ばれ、他はなぜ負けたのかを表示。=、^~、~、~* の優先順位を検証できる無料オンラインテスター。

トラッキングなし ブラウザで動作 無料
設定はブラウザ内でローカルに解析され、アップロードされません。サーバー設定にはアップストリームのホスト名や認証ブロックが入っています。ネットワークパネルを開いて沈黙したままなのを確かめるか、いっそオフラインで試してください。
実在する設定ミスを試す
選ばれた location
~* \.(gif|jpg|jpeg)$

設定順で最初にマッチした正規表現です。長さは関係しません。

nginx が実際にマッチさせる対象
リクエストターゲット
/documents/1.jpg
正規化済み $uri
/documents/1.jpg
クエリ文字列 $args

マッチは正規化済みのパスだけに対して走ります。クエリ文字列は最初に切り離され、一切関与しません。

そのブロックが勝った理由
そのブロックが勝った理由
location 段階 結果 理由
2 = / 完全一致 マッチなし = の location は URI 全体が等しいことを求めます。先頭一致では足りません。
3 / 前方一致 マッチしたが短い マッチはしましたが、別の前方一致がより多くの文字にマッチしました。
4 /documents/ 前方一致 マッチしたが短い マッチはしましたが、別の前方一致がより多くの文字にマッチしました。
5 ^~ /images/ 前方一致 マッチなし URI はこの前方一致で始まっていません。
6 ~* \.(gif|jpg|jpeg)$ 正規表現 選択 設定順で最初にマッチした正規表現です。長さは関係しません。

nginx location 修飾子の比較:=、^~、~、~*

nginx location 修飾子の比較:=、^~、~、~*
修飾子 書き方 マッチの基準 順序 正規表現を止める 典型的な用途
= location = /path 完全一致 1 はい / のような頻出パス——最速のマッチ。
^~ location ^~ /path 前方一致 2 はい アップロード先など、絶対に正規表現へ渡してはいけないディレクトリ。
~ location ~ regex PCRE 正規表現 3 いいえ 大文字小文字を区別する拡張子ルーティング。
~* location ~* regex PCRE 正規表現 3 いいえ 大文字小文字を区別しない拡張子ルーティング。
(なし) location /path 前方一致 4 いいえ パスによる一般的なルーティング。
@ location @name 内部専用 いいえ error_page と try_files のフォールバック先。

順序の列は単純な序列ではありません。前方一致 location が正規表現の評価を止めるのは、^~ を持ち、かつ自身が最長マッチであるときだけです——^~ のブロックが何もしていないように見えることがあるのは、まさにこのためです。

nginx location の優先順位:判定の流れ

nginx location の優先順位:判定の流れ
# 段階 探索を終える 何が起きるか
1 正規化 いいえ パーセントデコード、. と .. の解決、連続スラッシュの圧縮。クエリ文字列はここで切り離され、マッチには一切参加しません。
2 完全一致 はい location = /path を等価比較します。ヒットすれば探索は即座に終わります。
3 自動リダイレクト はい 名前が URI にスラッシュを足したものになっているプロキシ location。nginx は 301 を返し、正規表現には届きません。
4 前方一致 いいえ マッチした前方一致がすべて比較され、最長のものが覚えられます。設定の順序は無視されます。
5 ネスト いいえ 勝った前方一致の中へ降ります。ネストした正規表現は親レベルより先に試されます。
6 正規表現 はい 正規表現は設定順に試され、最初のマッチが勝ちます。後から書いた、より長い、より限定的な正規表現は実行されません。
7 フォールバック はい どの正規表現もマッチしなかったので、先に覚えておいた前方一致が使われます。
マッチ順序、^~ による短絡、ネストした location への降下、自動リダイレクトの挙動、URI の正規化は nginx 自身のソースと照合し、nginx 1.27.5 上で設定を実際に動かして確認しました。 — Go-Tools エンジニアリングチーム · Jul 22, 2026

このページの選択ルールは二次的な解説記事からの引き写しではなく、実際に動作する nginx 1.27.5 に対して検証したものです。エンジンも、その実行結果から起こした単体テストでカバーしています。

nginx location マッチ:早わかり

nginx は前方一致より先に正規表現 location を処理しますか?

いいえ——先に調べるのは前方一致ですが、マッチする正規表現があればそちらが勝ちます。 nginx はまずすべての前方一致 location を調べ、最長のマッチを覚えます。そのうえで、ファイルに書かれた順に正規表現 location を評価し、最初にマッチしたものが勝ちます。どの正規表現もマッチしなければ、覚えておいた前方一致 location が使われます。唯一の例外が ^~ で、最長マッチの前方一致がこれを持っている場合、正規表現フェーズはまるごとスキップされます。

nginx で location ブロックの書き順は結果に影響しますか?

影響するのは正規表現 location だけです。 前方一致 location は——=^~ も含めて——最長マッチで選ばれるため、ファイル内の順序は無関係です。正規表現 location は上から順に試され、最初のマッチが勝つので、正規表現ブロックを動かすとどれが実行されるかが変わります。広いパターンの下に置かれた、より限定的な正規表現は決して実行されません。

^~ 修飾子は実際のところ何をしていますか?

優先度を上げるのではなく、前方一致の時点で nginx を止めます。 最長マッチの前方一致 location が ^~ を持っていると、nginx は正規表現フェーズをスキップしてそのブロックを使います。前方一致が長くなるわけでも、他の前方一致より上位に来るわけでもなく、正規表現の評価を抑えるだけです。より長い修飾子なしの前方一致も同時にマッチしていると ^~ ブロックが何もしていないように見えるのは、そのためです。覚えられるのは長いほうで、そちらは何も抑制しません。

location /static と location /static/ は同じですか?

違います——/static は /staticfoo にもマッチします。 前方一致は単なる文字列比較でパスの区切りは見ないので、location /static/staticfiles/static-backup も処理します。別の話として、/static/proxy_pass と組み合わせている場合、末尾スラッシュなしの /static へのリクエストは、正規表現が検討される前に 301 で /static/ へリダイレクトされます。

nginx はマッチ前に %2F をデコードし、二重スラッシュをまとめますか?

はい——マッチ対象は正規化済みの URI で、生のリクエストではありません。 nginx は location を選ぶ前に %XX をデコードし、... を解決し、連続するスラッシュを圧縮します。デコードされた %2F は本物の区切りになってこの解決に参加するため、/a/b%2F..%2Fzz/a/zz としてマッチします。クエリ文字列は最初に切り離され、マッチには一切関与しません。

nginx の location ブロックとは?

location ブロックは、URI がパターンにマッチしたリクエストをどう扱うかを nginx に伝えます。1つの server ブロックには普通いくつも入っていて、面白いのは各ブロックが何をするかではなく、nginx がどれを選ぶかです——選択ルールが、多くの人の想定とは違うからです。

書き方は5種類あります。location = /path は URI 全体が等しいときだけマッチします。location /path はその文字列で始まる URI すべてにマッチします。location ^~ /path は同じ前方一致比較に、もう1つ効果が付いたものです。location ~ regexlocation ~* regex は PCRE パターンを、それぞれ大文字小文字を区別する/しない形で適用します。location @name は URI のマッチに一切参加せず、try_fileserror_page の飛び先としてのみ存在します。

選択は段階的に進みます。まず URI が正規化されます。パーセントデコード、... の解決、連続スラッシュの圧縮、クエリ文字列の切り離しです。次に URI と等しい = の location があれば、そこで探索は即座に終わります。続いてマッチする前方一致がすべて比較され、最長のものが覚えられます——ここでは設定の順序はまったく関係しません。覚えられた前方一致が ^~ を持っていれば、nginx は止まってそれを使います。そうでなければ正規表現 location がファイルに書かれた順に試され、後ろのものがどれだけ限定的でも最初のマッチが勝ちます。どれもマッチしなければ、覚えておいた前方一致が使われます。

この2つのルールは逆方向を向いていて、混乱はそこに住んでいます。前方一致は順序と無関係に長さで選ばれ、正規表現は長さと無関係に順序で選ばれます。上から下に読んで正しく見える設定でも、意図しない場所へリクエストを流すことがあり、何度読み返しても分かりません。このページは、あなた自身の設定に対してこの一連の流れを再生し、各ブロックがどこで脱落したのかを示します。

# From the nginx documentation. Which block serves each request?
server {
    location = /                   { }   # A
    location /                     { }   # B
    location /documents/           { }   # C
    location ^~ /images/           { }   # D
    location ~* \.(gif|jpg|jpeg)$  { }   # E
}

#   /                        -> A   exact match, search ends here
#   /index.html              -> B   no regex matched, longest prefix used
#   /documents/document.html -> C   longer prefix than B
#   /images/1.gif            -> D   ^~ won the prefix stage, regex skipped
#   /documents/1.jpg         -> E   regex beats the longer prefix C

# The last two lines are the whole lesson: identical-looking prefixes
# behave differently because only one of them carries ^~.

主な機能

負けたブロックすべてを、脱落した段階つきで

書いた location が1つずつ行になります。マッチしたが短かった、^~ の前方一致が勝ったのでスキップされた、先の正規表現がマッチしたので到達不能、単にマッチしなかった。実際に疑問を解くのは、たいてい「他がなぜ負けたか」を知ることです。

4段階の判定チェーンを、そのまま再生

正規化、完全一致、最長前方一致の記憶、^~ による短絡、ファイル順の正規表現、そしてフォールバックを、抽象的な説明ではなく、あなた自身の設定に対する個別のステップとして表示します。

^~ の短絡を目に見える形に

^~ の前方一致が正規表現フェーズを抑えたときは、スキップされた正規表現が黙って消えるのではなく「スキップ」と表示されます。より長い修飾子なしの前方一致が勝って ^~ が効かなかったときも、それが分かります。

ネストした location は平坦化せずに解決

nginx は勝った前方一致の中へ降りて子を探索するので、ネストした正規表現が親レベルより先に走ります。ネストしたブロックはテーブルでもインデントを保ち、構造が読み取れます。

PCRE 固有の構文を先に検出

ブラウザが動かすのは PCRE ではなく ECMAScript の正規表現です。アトミックグループ、絶対最大量指定子、POSIX クラス、\A や \K のようなエスケープは、黙って誤評価されるのではなく印が付くので、自信ありげな誤答が事実として出てくることはありません。

何もアップロードしない——ブラウザ内で動きます

サーバー設定にはアップストリームのホスト名、内部ポート、認証ルールが入っています。解析は依存関係なしの素の文字列処理で、ネットワーク呼び出しはありません。ビルドごとの自動契約テストで検証しています。

同じ疑問に答える他の方法

nginx -T

コマンドライン

完全に解決済みの設定をダンプします。実際に何が読み込まれているかを確かめるには非常に有用です。ただし、ある URI がどの location を選ぶかは教えてくれません——そこがこのページの埋める隙間です。

error_log ... debug

稼働中のサーバー

手に入る中で最も権威のある答えです。"using configuration" の行に、nginx が本当に選んだブロックが書かれます。必要なのは root 権限、リロード、そして到達できるサーバー——つまり答えが出るのはデプロイの後で、前ではありません。

設定シンタックスチェッカー

ホスティングサービス

ファイル全体の lint やセキュリティルールに強い一方、たいていサーバー側で動きます。つまり内部ホスト名や証明書パスを含む設定をアップロードすることになります。

ドキュメントを読む

リファレンス

nginx のドキュメントはアルゴリズムを正確に述べていて、一度は読む価値があります。間違いが忍び込むのは、それを8つのブロックと1つの URI に手作業で当てはめるところです。ルールのうち2つが逆方向を向いているからです。

nginx location マッチの例

正規表現が、より長い前方一致に勝つ

location /documents/  ·  location ~* \.(gif|jpg|jpeg)$  ·  GET /documents/1.jpg
~* \.(gif|jpg|jpeg)$ wins

前方一致 /documents/ はマッチし、しかもファイル内で最長の前方一致なので nginx はそれを覚えます——が、そのうえで正規表現を評価し、最初にマッチしたものにリクエストを渡します。長さは正規表現フェーズに負けるのです。この前方一致を ^~ /documents/ と書いていれば、正規表現は一度も実行されませんでした。これは nginx 公式ドキュメントの例で、体に入れておく価値がいちばん高い一つです。

PHP が実行されてしまうアップロードディレクトリ

location /uploads/  ·  location ~ \.php$ { fastcgi_pass ... }  ·  GET /uploads/evil.php
~ \.php$ wins — the upload lands in the interpreter

前方一致 /uploads/ はマッチしますが、修飾子なしの前方一致は正規表現フェーズを止めないため、誰かがアップロードしたファイルがそのまま PHP-FPM に渡されます。location ^~ /uploads/ と書けば正規表現フェーズが短絡し、この穴は塞がります。これは仮定の話ではありません。アップロードから RCE に至る長い一連の報告はこの形をしていて、脆弱と安全の差はわずか2文字です。

静かに何もしていない ^~

location ^~ /a/  ·  location /a/b/  ·  location ~ \.php$  ·  GET /a/b/x.php
~ \.php$ wins — the ^~ never applied

^~ が正規表現フェーズを抑えるのは、それ自身が最長マッチの前方一致であるときだけです。ここでは /a/b/ のほうが長いので nginx が覚えるのはそちらで、修飾子なしのため正規表現フェーズはそのまま走ります。^~ のブロックはファイルに残り、守っているように見えますが、このリクエストには何の効果もありません。設定を上から下に読んでも気づけません。前方一致の長さを比べて初めて分かります。

/static は /staticfoo まで拾ってしまう

location /static  ·  location /static/  ·  GET /staticfoo
/static wins

前方一致は文字を比べるのであって、パスの区切りは見ません。/staticfoo は /static で始まるのでマッチし、/static/ はその位置にスラッシュがないため一切マッチしません。先頭の文字がたまたま同じというだけのパスは、すべてこのブロックが処理します——/static のルールが /static-backup まで配信してしまうのは、こうして起きます。

勝つのは最適な正規表現ではなく、最初の正規表現

location ~ ^/a  ·  location ~ ^/a/b/c$  ·  GET /a/b/c
~ ^/a wins; ~ ^/a/b/c$ is unreachable

正規表現はファイルに書かれた順に評価され、最初のマッチで探索が終わります。2つ目のブロックのほうが限定的で、この URI にぴったり一致しますが、実行されることはありません——どのリクエストに対しても、です。前方一致 location は順序と無関係に長さで選ばれ、正規表現 location は限定度と無関係に順序で選ばれます。この2つを取り違えるのが、誰かがファイルを整理した後にルールが「効かなくなった」ときの定番の原因です。

エンコードされたトラバーサルはマッチ前に解決される

location /a/  ·  location /b/  ·  GET /a/b%2F..%2Fzz
$uri becomes /a/zz, so /a/ wins

nginx は location を見に行く前に、パーセントデコード、. と .. の解決、連続スラッシュの圧縮を済ませます。%2F は本物の区切りにデコードされたうえでその解決に参加するので、このターゲットは /a/b/ の中に留まりません——着地点は /a/zz です。正規化済みの $uri ではなく入力したままのターゲットに対してマッチさせると、ここでは答えを間違えます。

nginx location テスターの使い方

  1. 1

    server ブロックを貼り付ける

    server ブロックまるごとでも、いま考えている location ブロックだけでもかまいません。ネストした location も解釈し、元の行番号を保持するのでテーブルとファイルが突き合わせられます。

  2. 2

    リクエスト URI を入力する

    パーセントエンコードやクエリ文字列も含めて、実際に届くままのパスを入力します。テーブルの上の3行が、マッチ前にどう正規化されるかを示します。

  3. 3

    勝者を見て、次に敗者を見る

    判定カードが選ばれたブロックと一行の理由を示します。その下のテーブルが他のすべてのブロックについて、どの段階で脱落したのかとその理由を説明します。

  4. 4

    診断を確認する

    アンカーのない正規表現、末尾スラッシュのない前方一致、正規表現パターンを書いた ^~、到達不能な重複、PHP の正規表現から届いてしまうアップロードディレクトリが、いずれも報告されます。

  5. 5

    その状態のまま共有する

    リンクをコピーすると設定と URI が URL フラグメントに入り、同僚はあなたが見ているものをそのまま開けます。フラグメントがサーバーへ送られることはありません。

nginx location でよくある間違い

^~ が長い前方一致より優先されると思い込む

^~ が見られるのは、すでに長さで勝った前方一致に対してだけです。より長い修飾子なしの前方一致が先に勝ち、その後は ^~ が無いかのように正規表現フェーズが走ります。

✗ 誤り
location ^~ /a/ { }
location /a/b/ { }
location ~ \.php$ { }
# /a/b/x.php -> ~ \.php$
✓ 正しい
location ^~ /a/ { }
location ^~ /a/b/ { }
location ~ \.php$ { }
# /a/b/x.php -> ^~ /a/b/

末尾スラッシュのない前方一致が兄弟パスまで拾う

前方一致はパスの区切りではなく文字を比べるので、先頭の文字が同じ兄弟パスもすべてこのブロックが処理してしまいます。

✗ 誤り
location /static { root /var/www; }
# also serves /staticfoo and /static-backup
✓ 正しい
location /static/ { root /var/www; }
location = /static { return 301 /static/; }

限定的な正規表現を広いものの下に置く

正規表現はファイル順に試され、最初のマッチで探索が終わるので、より厳密なブロックはどのリクエストに対しても実行されません。

✗ 誤り
location ~ ^/api { }
location ~ ^/api/v2/users$ { }
# the second is unreachable
✓ 正しい
location ~ ^/api/v2/users$ { }
location ~ ^/api { }

^~ の後ろに正規表現を書く

^~ が取るのは文字どおりの前方一致です。nginx は文句も言わずにファイルを読み込み、そのブロックは単に何にもマッチしません。レビューで見つけにくいのはそのためです。

✗ 誤り
location ^~ "\.php$" { deny all; }
✓ 正しい
location ~ \.php$ { deny all; }

クエリ文字列がマッチに参加すると思い込む

クエリ文字列は正規化の段階で切り離されるので、location がそれにマッチすることはありえません。代わりにブロックの中で $arg_name を読みます。

✗ 誤り
location /search?q= { }
# never matches anything
✓ 正しい
location /search {
    if ($arg_q = "") { return 400; }
}

nginx location テスターでできること

本番に出す前に設定を確かめる
編集したがまだデプロイしていない server ブロックのルーティングを検討できます。ここで捕まえられるのは特定の URI の形でしか現れない不具合で、リロード後のスモークテストがいちばん取りこぼしやすい種類です。
ルールが効かなくなった理由を突き止める
以前は走っていた正規表現が走らなくなったなら、ほぼ確実に順序の犠牲者です。先に何かがマッチしたか、その上に ^~ が現れたかです。テーブルはそのブロックを到達不能と示し、リクエストを持っていったブロックの名前も出します。
アップロードやメディアのディレクトリを監査する
アップロード実行の形を再現するプリセットを読み込み、自分のパスを貼り付けます。書き込みを受け付けるディレクトリの中のリクエストを PHP の正規表現が持っていっているなら、診断がそう伝え、関係する両方のブロックを名指しします。
レビューの指摘を証拠で決着させる
リンクをコピーすると、そのときの設定と URI が URL フラグメントに入ります。これをプルリクエストに貼れば、優先順位をめぐる議論を、誰でも再実行できる判定テーブルに置き換えられます。
選択アルゴリズムを教える
2つのリファレンステーブルは静的でクロール可能な資料なので、そのまま指し示せます。プリセットは、サーバーを壊さずに各トラップを実演します。とくに ^~ の例は、議論を手早く終わらせがちです。

nginx の location 選択はどう動くか

正規化は location を見に行く前に済んでいる
URI はパーセントデコードされ、... のセグメントが解決され、連続スラッシュがまとめられ、そのあとで初めて location が選ばれます。デコードされた %2F は本物の区切りになってこの解決に参加するので、/a/b%2F..%2Fzz/a/zz としてマッチします。デコード後も文字どおり残る例外が3つあります。%25%23%3F です——だから /a%3Fx=1 はパスに疑問符を持ち、クエリ文字列は空になります。ここでの + は空白ではありません。空白になるのは %20 だけです。ルートより上へ登るトラバーサルと不正なエスケープは、どちらもマッチが始まる前に 400 で拒否されます。
決めるのは前方一致の長さで、設定の順序ではない
マッチした前方一致 location はすべて比較され、ファイルの先頭にあろうと末尾にあろうと最長のものが勝ちます。比較はパスの区切りではなく文字単位なので、/static/staticfoo にマッチします。勝者はすぐ使われるのではなく覚えられます。正規表現フェーズがまだ上書きし得るからです。
^~ は正規表現を抑えるだけで、優先度は上げない
この修飾子が見られるのは、すでに長さで勝った前方一致に対してだけです。より長い修飾子なしの前方一致もマッチしていれば覚えられるのはそちらで、正規表現フェーズはいつもどおり走ります——その ^~ ブロックはこのリクエストに何の効果もありません。ネストした location に ^~ を付けても外側で宣言された正規表現からは守れませんし、自分のブロックの中にネストした正規表現を抑えることもありません。
正規表現はファイル順に走り、最初のマッチで探索が終わる
nginx は正規表現 location を書かれた順のまま保持し、並べ替えません。限定度、長さ、アンカーの有無はどれが先に試されるかに影響しないので、広いパターンの下に置いた厳密なパターンは死んだ設定です。マッチした正規表現 location にも降りていくため、そのネストした location はその後に探索されます。
PCRE と ECMAScript は同じ言語ではない
nginx は location の正規表現を PCRE でコンパイルし、UTF モードも複数行モードも使わないため、パターンはバイト単位で動き、^ は URI の先頭だけにアンカーします。1つの違いはセキュリティに直結します。PCRE の $ は末尾の改行の直前にもマッチするので、%0A で終わる URI は JavaScript エンジンなら拒むところを \.php$ に依然として一致します。この挙動はここで再現して報告します。拡張子を鍵にしたルールをすり抜ける既知の手口だからです。

nginx location の書き方:ベストプラクティス

書き込み可能なディレクトリは修飾子なしではなく ^~ で守る
アップロードを受け付けるディレクトリには location ^~ /uploads/ が必要です。そうすれば正規表現フェーズが保存済みファイルをインタプリタへ渡せません。修飾子なしの前方一致は同等に見えて、同等ではありません。
ディレクトリの前方一致には末尾スラッシュを付ける
/staticfoo/static-backup まで同じブロックで配信したいのでなければ、location /static ではなく location /static/ と書きます。スラッシュなしのパスも扱う必要があるなら、別に location = /static を足します。
正規表現は限定的なものから順に並べる
最初のマッチが勝つので、広いパターンを厳密なものの上に置くと厳密なほうが到達不能になります。正規表現を少なく保ち、順序を意図的に決めるほうが、後から重なりを推理するより保守しやすくなります。
パスの先頭に当てたい正規表現にはアンカーを付ける
location ~ /admin は URI のどこでも探すので /public/admin/x にもマッチします。先頭のつもりなら ~ ^/admin と書きます。末尾だけにアンカーするのは拡張子ルーティングでは普通で、正しい書き方です。
並べ替えたら必ずルーティングを確認し直す
ブロックの移動は前方一致には安全ですが、正規表現では挙動を変えます。行を入れ替えただけの差分はレビューでは無害に見えるので、影響する URI を流し直すのがいちばん安上がりな押さえ方です。

nginx location テスター よくある質問

nginx がどの location を選んだのか、どう調べればいいですか?
設定とリクエスト URI をこのテスターに貼り付ければ、勝ったブロックと、他の各ブロックが脱落した理由が分かります。稼働中のサーバーでは error_log /var/log/nginx/debug.log debug; を足して "using configuration" の行を探すと、選ばれた location が書かれています。2つの方法は別の問いに答えます。ログは本番のサーバーが実際にどうしたかを教え、このページはまだデプロイしていない設定がどうなるかを教えます。
nginx location の正規表現が効かないのはなぜですか?
原因はたいてい3つのどれかで、判定テーブルがどれかを示します。先に別の正規表現がマッチしていて、あなたのものは実行されなかった——正規表現はファイルの順に試され、最初のマッチが勝ちます。あるいは最長マッチの前方一致が ^~ を持っていて、正規表現フェーズがまるごとスキップされた。あるいは正規表現は正しいのに URI が思っているものと違う——マッチはパーセントデコードと .. の解決を済ませ、クエリ文字列を外した正規化済みのパスに対して走ります。
完全一致が発動しないのはなぜですか?
= の location は URI 全体が等しいことを要求します。パターンで始まっていればよいのではありません。location = /a//a にマッチせず、location = /a/a/b にマッチしません。末尾スラッシュはここではただの文字なので、2つの書き方は別の文字列です。完全一致の location がマッチすると探索は即座に終わり、それ以外は比較すらされません。
location ブロックはクエリ文字列にマッチしますか?
しません。クエリ文字列は正規化の段階で切り離され、location の選択はパスだけに対して行われます。だから location = /a/a?x=/b へのリクエストにマッチします。パラメータで分岐したいなら、ブロックの中で $arg_name$args を読む必要があります。知っておくと得な細かい点として、%3F はパスに残る文字どおりの疑問符にデコードされるので、/a%3Fx=1 はクエリ文字列が空で、パスに ? を含みます。
nginx の location で JavaScript の正規表現構文は使えますか?
いいえ——nginx が使うのは PCRE で、この違いは効いてきます。このページはブラウザ内で動き、そこには ECMAScript 正規表現しかないため、PCRE 固有の構文は黙って誤評価されるのではなく検出して印が付きます。アトミックグループ、絶対最大量指定子、(?i) のようなインライン修飾子、[[:alpha:]] のような POSIX クラス、そして JavaScript が普通の文字として読み流す \A\K などのエスケープです。印が付いた location があっても残りの候補は nginx の順序で評価されますが、そのブロックの判定は実機で確かめてください。パターン自体を書いているところなら、正規表現テスターが ECMAScript 構文を詳しくカバーしています。
nginx location の前方一致は大文字小文字を区別しますか?
Linux では区別します——location /Static//static/x にマッチしません。macOS や Cygwin のように大文字小文字を区別しないファイルシステムでは、nginx は前方一致を区別せずに比較し、さらにすべての正規表現 location を ~* のように振る舞わせます。本ページが再現するのは Linux の挙動で、本番サーバーはほぼこちらです。Mac で開発して Linux にデプロイしていると、この差が壊れたルールを出荷まで隠します。
try_files は選ばれた location ブロックを変えますか?
変えません。location の選択が先に終わり、try_files はその後、すでに勝ったブロックの中で走ります。try_files のあるブロックにリクエストが届かないなら、このディレクティブは無関係です——よくある原因は ~ \.php$ の正規表現が先にリクエストを持っていき、フォールバックを持つ前方一致ブロックに出番が回らないことです。なお、その後に発行される内部リダイレクトはマッチをやり直すので、書き換えられた URI は location リストの先頭から解決し直されます。
ディレクトリをスラッシュなしで要求すると nginx が 301 を返すのはなぜですか?
別々の仕組みが2つあります。名前が / で終わる location が proxy_pass などの *_pass ディレクティブを持っている場合、同じパスのスラッシュなしのリクエストは location 選択の途中で301 が返ります——正規表現が評価されるより前です。もう1つは、パスがディスク上の実在するディレクトリに解決したときに静的ファイルモジュールが返す 301 です。前者はここで見えます。後者はファイルシステム次第です。location = /path を足せば前者は抑えられます。
ネストした location ブロックは結果を変えますか?
変えます。しかも見落としやすい形でです。nginx は勝った前方一致 location の中へ降りて子を探索するので、ネストした正規表現は親レベルの正規表現より先に試されます。外側のブロックに付けた ^~ は、その内側にネストした正規表現からは守ってくれませんし、外側の兄弟ブロックが先に勝つと、全体としては長い前方一致がネストのせいで到達不能になることもあります。ネストしたブロックは、書いたままのインデントで再現します。
nginx の設定はどこかにアップロードされますか?
されません。解析もマッチもあなたのブラウザ内で、素の文字列操作として行われます——サーバー呼び出しはなく、何も保持しません。これは多くのツール以上に重要です。実際の server ブロックにはアップストリームのホスト名、内部ポート、証明書のパス、認証ルールが入っているからです。言葉を信じる必要はありません。ブラウザの開発者ツールを開き、入力中もネットワークパネルが沈黙したままなのを見てください。回線を切ったまま試してもかまいません。外部リクエストが存在しないことはビルドごとの自動契約テストでも強制されているので、こっそり後退することもありません。

cURLコマンドジェネレーター&ビルダー

Web と API

ブラウザでcurlコマンドを作成 — メソッド・ヘッダー・認証・ボディを設定してすぐにコピーできるコマンドを生成。Bearer・POST JSON・ファイルアップロードのプリセットも搭載。無料・プライバシー保護・登録不要。

htpasswd ジェネレーター — bcrypt・Apache MD5(apr1)・Basic認証

Web と API

bcrypt・Apache MD5(apr1)・SHA-1 などで htpasswd エントリーを生成。Apache・nginx・Docker 設定をすぐに貼り付けられる形式で出力。100% ブラウザ完結・アップロード不要。

Open Graph・メタタグ ジェネレーター

Web と API

Open Graph、Twitter Card、SEO メタタグをまとめて生成。Google・Facebook・X のライブプレビュー付き。100% 無料・ブラウザ内処理・登録不要で、コードをそのままコピー&ペーストできます。

traceparent デコーダー — W3C Trace Context

Web と API

16進数の桁を数える必要はもうありません。無料のオンライン traceparent デコーダー。ブラウザ内で動作し、何もアップロードしません。trace ID、span ID、trace-flags の8ビット全部、tracestate 検証、Datadog・X-Ray・B3 変換に対応。

AES復号ツール — OpenSSL・CryptoJS互換

セキュリティツール

AESをオンラインで復号 — GCM/CBC/CTR、パスフレーズまたは生鍵に対応し、OpenSSLとCryptoJSの「U2FsdGVkX1」形式を自動検出します。処理は100%ブラウザ内で完結し、鍵がこのページから出ることはありません。

AES暗号化ツール — GCM・CBC・CTR対応

セキュリティツール

無料のAESオンライン暗号化ツール — AES-128/192/256、GCM/CBC/CTR、パスフレーズ(PBKDF2)または生鍵に対応。処理は100%ブラウザ内で完結し、外部にアップロードされません。