環境構築からWEBアプリ開発・スマホアプリ開発まで。ときには動画制作やゲームも。

supilog
すぴろぐ

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

【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ディレクティブの処理の流れ

  1. まず前方一致を検索する
    1. 完全一致(=)が見つかった場合は検索終了し、対応するlocationを使用する。
    2. 修飾子なしと正規表現を適用させない前方一致(^~)で、最も長く一致するものを検索して保存。「正規表現を適用させない前方一致」が選ばれた場合は、正規表現のチェックを行わずに検索終了。
  2. 正規表現を検索する
    1. 一致する正規表現が見つかったら検索を終了し、対応するlocationを使用します。最初にマッチしたものが適用される。
    2. 一致する正規表現がない場合は、保存された前方一致文字列に対応する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ディレクティブが適用されてしまっている可能性があるわけです。しっかり理解して、正しく設定したいものです。

あと、思ったのは、「正規表現を適用させない前方一致”^~”」はよほどの事がない限り、利用しない方が良さそうだ。そもそもコレがなければ、かなりスッキリしたルールになり、設定ミスも減る。どうしても正規表現が干渉してしまい表現方法がない場合にのみ利用することにしよう。ではまた。