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