NginxのURIマッチング

Nginxで分かりにくいLocationディレクティブの記述方法とその特徴に関する覚書。公式ドキュメントの部分翻訳です。

作成日:2019-03-04

環境

Location ディレクティブ

nginxは、リクエストURIに応じて異なる設定を適用することができる。[1]

location [modifer] uri {
  ...
}

これはNginxの設定の基本であるが、URIのマッチングルールは意外と複雑で、さらにマッチング後の特徴も異なり、設定に詳しくないと罠にはまりやすい。

Locationの定義方法一覧

Modifier Definition Type
None 前方一致 Prefix
^~ 前方一致(一致時、正規表現は評価しない) Prefix
= 完全一致(一致時、マッチングを終了) Prefix
~ 正規表現 RegEx
~* 正規表現(大文字小文字を区別しない) RegEx

完全一致、前方一致、正規表現

マッチングは、次の順序で行われる。

  1. 前方一致の条件を評価する。一致した条件の中で最も長い条件を選ぶ。
  2. 正規表現を上から順に評価し、一致した条件の設定を適用する。
  3. 正規表現にヒットしなかった場合、1で選択した条件の設定を適用する

前方一致は=^~を使うことで高速化が図れる。

正規化されたURI

正規化されたURIとは、

そのため、$request_uri$uriは同じではない。[2]

プロキシと組み合わせるときの注意点

Locationディレクティブでproxy_passなどのプロキシ処理を行う場合、URIの末尾が/でない場合は末尾が/のURIへ301リダイレクトされる。プロキシする場合は末尾のスラッシュを忘れないようにしたい。

なお、この挙動を上書きしたい場合は完全一致の条件を使用すればよい。

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}

proxy_passの値の設定の仕方はこちら。


  1. http://nginx.org/en/docs/http/ngx_http_core_module.html#location ↩︎

  2. https://stackoverflow.com/questions/48708361/ ↩︎