それで、ようやく正規表現について学ぶようにしました。通常、正規表現を使用する場合、区切り文字(「/」など)を「\」でエスケープする必要があります。しかし、Nginxで正規表現を使用している場合、「/」は区切り文字としてではなく文字どおりに扱われるように見えます。
NginxはPCREエンジンを使用して正規表現を評価するので、エスケープされていないデリミタを何の影響もなく投げることができるのは意味がありません。
例として、以下の正規表現は単一のIPアドレスを許可し、その他すべてを拒否します。
location ~ /\.serverfault {
allow 1.2.3.4;
deny all;
}
しかし、私はそれが正しく機能するためにこのようにする必要があると思います:
location ~ \/\.serverfault {
allow 1.2.3.4;
deny all;
}
ここで何が欠けていますか?
/
をエスケープする必要がないのは、/
がnot区切り文字であるためです。
区切り文字が必要な他のアプリケーションで正規表現を書くことに慣れているようです。たとえば、Perlでは次のように記述します。
m/\/.serverfault/
ここで重要なのは区切り文字を選択したです。 /
について特別なことは何もありません。実際、どんな文字でも使用できます。 #
もかなり一般的です。
m#/.serverfault#
choose特定の区切り文字を使用していて、その文字が正規表現に含まれている場合は、エスケープする必要がありますまたは別の区切り文字を選択。
Nginxは正規表現の一致に対して置換操作を実行する機能を必要としないため(たとえば、s/old/new/
)、区切り文字を使用する必要もありません。したがって、nginxで正規表現を指定する場合、区切り文字は使用されません。ほとんど)エスケープする必要はありません。