【nginxの設定】locationの記述ルールを確認

目次
公式ドキュメント
https://docs.nginx.com/nginx/admin-guide/web-server/web-server
https://nginx.org/en/docs/http/ngx_http_core_module.html#location
まずはじっくり公式ドキュメントを読んでみる。
うーん。ぱっとみで簡単に読み解くのは難しいですね!落ち着いて整理してみましょう。
locationディレクティブの種類
locationの記述方法は以下の種類がある。
修飾子 | 説明 | 例 |
---|---|---|
修飾子なし | 前方一致 | location /supilog/ { } |
= | 完全一致 | location = /supilog/ { } |
~ | 大文字小文字を区別する正規表現 | location ~ /supilog/ { } |
~* | 大文字小文字を区別しない正規表現 | location ~* /supilog/ { } |
^~ | 正規表現を適用させない前方一致 | location ^~ /supilog/ { } |
重要なのは大きく分けて、前方一致(完全一致含む)と正規表現の2種類があるということ。
locationディレクティブの処理の流れ
- まず前方一致を検索する
- 完全一致(=)が見つかった場合は検索終了し、対応するlocationを使用する。
- 修飾子なしと正規表現を適用させない前方一致(^~)で、最も長く一致するものを検索して保存。「正規表現を適用させない前方一致」が選ばれた場合は、正規表現のチェックを行わずに検索終了。
- 正規表現を検索する
- 一致する正規表現が見つかったら検索を終了し、対応するlocationを使用します。最初にマッチしたものが適用される。
- 一致する正規表現がない場合は、保存された前方一致文字列に対応するlocationを使用します。
というルールのようです。
locationディレクティブの例
こちら公式に記載がある例です。
location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] }
URIパターン毎に例を見ていく。
Case1 /
“/”は完全一致するので、Aが適用される。
Case2 /index.html
「修飾子なし”/”」にマッチし、正規表現に当てはまらないので、Bが適用される。
Case3 /documents/document.html
「修飾子なし”/”」と「修飾子なし”/documents/”」にマッチするが、最長のものが優先なので、”/documents/”が優先される。正規表現に当てはまらないので、Cが適用される。
Case4 /images/1.gif
「修飾子なし”/”」と「正規表現を適用させない前方一致”^~ /images/”」と「正規表現”~* .(gif|jpg|jpeg)$”」にマッチする。「修飾子なし”/”」と「正規表現を適用させない前方一致”^~ /images/”」は最長のものが優先されるので、「正規表現を適用させない前方一致”^~ /images/”」が有効となり、正規表現を適用させないので、Dが適用される。
Case5 /documents/1.jpg
「修飾子なし”/”」と「修飾子なし”/documents/”」と「正規表現”~* .(gif|jpg|jpeg)$”」にマッチする。「修飾子なし”/”」と「修飾子なし”/documents/”」は最長のものが優先されるので、「修飾子なし”/documents/”」が有効。正規表現にマッチする場合は正規表現が優先されるので、Eが適用される。
ロジカルなテストを受けているみたいですね笑
まとめ
だいぶ理解が深まったような気がします。nginxの設定が思ったように動かない場合には、意図しないlocationディレクティブが適用されてしまっている可能性があるわけです。しっかり理解して、正しく設定したいものです。
あと、思ったのは、「正規表現を適用させない前方一致”^~”」はよほどの事がない限り、利用しない方が良さそうだ。そもそもコレがなければ、かなりスッキリしたルールになり、設定ミスも減る。どうしても正規表現が干渉してしまい表現方法がない場合にのみ利用することにしよう。ではまた。