Так что я ' я наконец-то научился изучать регулярные выражения. Обычно при работе с регулярными выражениями необходимо избегать разделителей (например, «/») с помощью символа «\». Но когда я использую регулярные выражения в 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, разделитель не используется и (почти) ничего не нужно экранировать.