Почему нет необходимости экранировать «/» в регулярных выражениях Nginx?

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

Nginx использует механизм PCRE для вычисления регулярных выражений, поэтому для меня не имеет смысла, что вы можете просто добавить неэкранированный разделитель без каких-либо последствий.

В качестве примера приведенное ниже регулярное выражение разрешает один IP-адрес и запрещает все остальные:

location ~ /\.serverfault {
    allow 1.2.3.4;
    deny all;
}

Но я думаю, что для правильной работы это должно быть так:

location ~ \/\.serverfault {
    allow 1.2.3.4;
    deny all;
}

Что мне здесь не хватает?

5
задан 20 January 2018 в 22:57
1 ответ

Причина, по которой вам не нужно экранировать / , заключается в том, что / не разделитель.

Это похоже, что вы привыкли писать регулярные выражения в других приложениях, где требуется разделитель. Например, в Perl вы можете написать что-то вроде:

m/\/.serverfault/

Ключ здесь в том, что вы выбрали разделитель . В / нет ничего особенного. Фактически, вы можете использовать практически любой символ. # также довольно распространено.

m#/.serverfault#

Если вы выбираете определенный разделитель, и этот символ появляется в регулярном выражении, вы должны экранировать его, или выбрать другой разделитель .

Поскольку nginx не нуждается в возможности выполнять операции замены для совпадений регулярных выражений (например, s / old / new / ), ему также не нужно использовать разделитель, таким образом когда вы указываете регулярные выражения в nginx, разделитель не используется и (почти) ничего не нужно экранировать.

8
ответ дан 3 December 2019 в 01:17

Теги

Похожие вопросы