NginxのURIマッチング
Nginxで分かりにくいLocationディレクティブの記述方法とその特徴に関する覚書。公式ドキュメントの部分翻訳です。
作成日:2019-03-04
環境
- nginx 1.15
Location ディレクティブ
nginxは、リクエストURIに応じて異なる設定を適用することができる。[1]
location [modifer] uri {
...
}
これはNginxの設定の基本であるが、URIのマッチングルールは意外と複雑で、さらにマッチング後の特徴も異なり、設定に詳しくないと罠にはまりやすい。
Locationの定義方法一覧
Modifier | Definition | Type |
---|---|---|
None | 前方一致 | Prefix |
^~ | 前方一致(一致時、正規表現は評価しない) | Prefix |
= | 完全一致(一致時、マッチングを終了) | Prefix |
~ | 正規表現 | RegEx |
~* | 正規表現(大文字小文字を区別しない) | RegEx |
完全一致、前方一致、正規表現
マッチングは、次の順序で行われる。
- 前方一致の条件を評価する。一致した条件の中で最も長い条件を選ぶ。
- 正規表現を上から順に評価し、一致した条件の設定を適用する。
- 正規表現にヒットしなかった場合、1で選択した条件の設定を適用する
前方一致は=
や^~
を使うことで高速化が図れる。
正規化されたURI
正規化された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
の値の設定の仕方はこちら。