Назад | Перейти на главную страницу

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

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