Итак, я решил наконец узнать о регулярных выражениях. Обычно при работе с регулярными выражениями необходимо избегать разделителей (например, «/») с помощью символа «\». Но когда я использую регулярные выражения в Nginx, может показаться, что "/" трактуется буквально, а не как разделитель.
Nginx использует механизм PCRE для оценки регулярных выражений, поэтому для меня не имеет смысла, что вы можете просто вставить неэкранированный разделитель без каких-либо последствий.
В качестве примера приведенное ниже регулярное выражение разрешает один IP-адрес и запрещает все остальные:
location ~ /\.serverfault {
allow 1.2.3.4;
deny all;
}
Но я думаю, что для правильной работы должно быть так:
location ~ \/\.serverfault {
allow 1.2.3.4;
deny all;
}
Что мне здесь не хватает?
Причина, по которой вам не нужно убегать /
в том, что /
является не разделитель.
Похоже, вы привыкли писать регулярные выражения в других приложениях, где требуется разделитель. Например, в Perl вы можете написать что-то вроде:
m/\/.serverfault/
Ключ здесь в том, что вы выбрали разделитель. В этом нет ничего особенного /
. Фактически, вы можете использовать практически любой символ. #
также довольно распространен.
m#/.serverfault#
если ты выберите определенный разделитель, и этот символ появляется в регулярном выражении, вы должны его избежать, или выберите другой разделитель.
Поскольку nginx не нуждается в возможности выполнять операции замены для совпадений регулярных выражений (например, s/old/new/
) также не нужно использовать разделитель, поэтому, когда вы указываете регулярные выражения в nginx, разделитель не используется и (почти) ничего не нужно экранировать.