Nginxのパターンマッチ
プレフィックス | 説明 | マッチしたとき | |
---|---|---|---|
A | なし | 正規表現とのマッチありの前方一致。 | ここでマッチしたとしても以降のD,Eで指定される正規表現にマッチしたらそちらが後勝ちする |
B | ^~ | 正規表現とのマッチなしの前方一致。 | ここでマッチすれば打ち止めてアクション実行 |
C | = | 正規表現とのマッチなしの完全一致。 | ここでマッチすれば打ち止めてアクション実行 |
D | ~ | 正規表現マッチ(大文字・小文字を区別する)。A,B,Cのマッチに失敗したとき、もしくはAがマッチしたときにマッチ実行される。 | |
E | ~* | 正規表現マッチ(大文字・小文字を区別しない)。A,B,Cのマッチに失敗したとき、もしくはAがマッチにもマッチ実行される。 |
ポイントは、プレフィックスなしAと正規表現マッチD,E(~,~*)をペアで考えるということである。
プレフィックスなしマッチAは、後で正規表現マッチD,Eで上書きされ得る、という相互関係がベースにある。
そしてAの上書きされないバージョンとしてのB(^~, 正規表現とのマッチなしの前方一致)がある。
たとえば、
location /static/ { # Aプレフィックスなし
}
location ~ \.png$ { # D正規表現(大文字小文字区別する)
}
このとき、正規表現D(~)が、先行する前方一致Aに優先する例外パターンとして機能している。つまり、プレフィックスなし/static/への設定に、正規表現D(~)での設定が優先されるのである。このように、プレフィックスなしAと正規表現パターンD,E(~,~*)との間には、「一般パターンとその例外」という基本構造がある。
さらに例外を上書きする例外として、「正規表現による例外によっても上書きされない強力な指定」としてのB(^~, 正規表現とのマッチなしの前方一致)が加わっている。この例として、先程の例にさらに以下が追加してあったとしよう。
location ^~ /static/js/ { # B
}
これにより、「/static/js/の配下にある*.pngファイル」はAの指定にもDの指定にマッチしなくなり、Bとしての設定が適用される。