Re: Не работают регулярные выражения в location
Maxim Dounin
mdounin на mdounin.ru
Пн Сен 4 12:52:45 UTC 2017
Hello!
On Sun, Sep 03, 2017 at 09:37:24AM -0400, Seriyyy95 wrote:
> Недавно обновил версию Nginx и столкнулся с проблемой, что перестали
> работать регулярные выражения в location вида:
>
> location ~ строка {}
>
> Хотя если просто написать location = /строка {} то это срабатывает, но нужно
> именно регулярное выражение, чтобы искалась не именно эта строка, любая URL,
> которая содержит нужную подстроку. Например, хочу заблокировать доступ к
> всем файлам AI-BOLIT на сервере, для этого делаю:
>
> location ~ ^/(AI-BOLIT|AIBOLIT|ai-bolit) {
> deny all;
> }
>
> Но эффекта 0, url без проблем открываются, хотя на
> http://nginx.viraptor.info/ показано что этот запрос должен работать.
> Дистрибутив CentOS 7, программу брал из Brouken repo. Вот вывод nginx -v:
[...]
> В чем может быть причина и что делать?
Наиболее частая причина подобных проблем с регулярными выражениями -
в том, что они выполняются последовательно, и используется
первое совпадение. Так, если у вас в начале конфига виртуального
сервера есть запись вида "location ~ / { ... }", то никакие другие
регулярные выражения работать не будут, ибо первое совпадение
случится именно у этого location'а, и именно он будет использован
для обработки запроса.
Чтобы такого не было - нужно чётко следить за тем, какие
location'ы, заданные регулярными выражениями, используются в блоке
server{}. А лучше - по возможности не использовать их, а
использовать обычные префиксные location'ы, где поведение гораздо
более интуитивно и легче поддаётся контролю администратором.
Подробнее об этой и других проблемах поддержки больших
конфигураций можно узнать из доклада Игоря
"Масштабируемая конфигурация nginx". Видео доклада и его
расшифровка есть тут:
https://habrahabr.ru/company/oleg-bunin/blog/313666/
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru