Nginx設定ファイルに記述するlocationディレクティブの一致規則に関する解説です。
locationとは、特定のディレクトリやファイルに対して処理を適用したい場合に使用するディレクティブです。
例えば、ルートURL「/」へのアクセスに対して、ドキュメントルートを設定する記述は以下のようになります。
location \ {
#ドキュメントルートの設定
root /var/www/html;
}
locationディレクティブで使用する修飾子
locationディレクティブでは、影響させるURLを指定するために、修飾子が用意されています。
修飾子 | 内容 |
---|---|
なし | 前方一致 |
^~ | 前方一致 |
= | 完全一致 |
~ | 正規表現(大文字小文字区別あり) |
~* | 正規表現(大文字小文字区別なし) |
修飾子の優先順位
locationディレクティブでは以下の順番で修飾子によるパスを評価し、一致したものを適用します。
- 前方一致、完全一致条件(修飾子なし、=、 ^~)を評価
- もっとも一致する条件の修飾子が「=」または「^~」であれば、そのlocationディレクティブを適用する
- もっとも一致する条件が修飾子なしの場合は、正規表現の評価に移る
- 正規表現(~、~*)を評価
- 正規表現の条件が記述されたlocationディレクティブを上から評価し、一致したらそれを適用する
前方一致、完全一致条件を評価
前方一致、完全一致条件は、アクセスしたパスに対してもっとも一致した条件のディレクティブを適用します。
#条件1: 「修飾子なし」前方一致
location / {
root /var/www/html/hoge;
}
#条件2: 「^~」前方一致
location ^~ /sample.html {
root /var/www/html/fuga;
}
#条件3: 「=」完全一致
location = / {
root /var/www/html/foo;
}
アクセスするパス | 適用される条件 |
---|---|
/ | 条件3: 「=」完全一致 |
/sample.html | 条件2: 「^~」前方一致 |
上記以外 | 条件1: 「修飾子なし」前方一致 (ただし、正規表現があればそちらも評価) |
最長一致に注意
前方一致条件では、条件式が最長のものが採用されます。
#条件1
location ^~ /sample {
root /var/www/html/hoge;
}
#条件2
location /sample2 {
root /var/www/html/fuga;
}
以下のような例だと、/sample2にアクセスした場合、条件1にも当てはまりますが、最長一致に従って条件2が採用されます。
「^~」付きの前方一致では正規表現は評価しませんが、この例では修飾子なしの前方一致条件となるため、この後に正規表現条件があればそちらも確認することになります。
このように、最長一致を考慮していないと思わぬ条件が適用されて混乱することもあるので注意が必要です。
正規表現条件を評価
正規表現条件は上から条件をチェックし、一番最初に一致した条件が適用されます。
location = /sample.html {
root /var/www/html/hoge;
}
#条件1: 正規表現(全角半角区別あり)
location ~ ^/sample\.php$ {
root /var/www/html/fuga;
}
#条件2: 正規表現(全角半角区別なし)
location ~* ^sample\.php$ {
root /var/www/html/foo;
}
アクセスするパス | 適用される条件 |
---|---|
/sample.php | 条件1: 正規表現(全角半角区別あり) |
/Sample.php | 条件2: 正規表現(全角半角区別なし) |