порядок обработки locations

Igor Sysoev is at rambler-co.ru
Tue Nov 16 10:23:43 MSK 2004


On Tue, 16 Nov 2004, Igor Sysoev wrote:

> On Mon, 15 Nov 2004, Yevgeniy Kruglov wrote:
>
> > Новый кучек конфига:
> >
> >         location /icons {
> >                 root    /usr/local/www;
> >                 expires 30d;
> >         }
> >
> > "location ~* ^.+\.(jpg|jpeg|gif|png|css)" не дает показывать /icons, error.log
> > пишет, что nginx ищет иконки в пути для ~* ^.+\.(jpg|jpeg|gif|png|css).
> > Место в конфиге ничего не меняет.
> > Запись типа "location ~* ^/icons/" работает, но правильно ли так?
>
> Дублирую ответ в список, так как проблема общая.
>
> location обрабатываются так: сначала ищется максимально совпадающий
> обычный location, его конфигурация запоминается. То есть, порядок
> написания locations без regexp не имеет значения. Затем проверяются
> все regexp'ы в порядке их написания в файле. При первом же попадании
> используется его конфигурация.
>
> Поэтому при такой конфигурации:
>
>          location /icons/ {
>                  root    /root1;
>          }
>
>          location ~* ^.+\.(jpg|jpeg|gif|png|css) {
>                  root    /root2;
>          }
>
> картинки всё равно будут отдаваться из /root2. /icons/ в виде regexp'а
> впереди "^.+\.(jpg|jpeg|gif|png|css)" лечит это:
>
>          location ~ ^/icons/ {
>                  root    /root1;
>          }
>
>          location ~* ^.+\.(jpg|jpeg|gif|png|css) {
>                  root    /root2;
>          }
>
> "~*" отличается от "~" тем, что во втором случае учитывается case и работает
> чуть быстрее.
>
> Ещё один вараинт - отрицательный regexp:
>
>          location /icons/ {
>                  root    /root1;
>          }
>
>          location ~* ^(?!/icons/).+\.(jpg|jpeg|gif|png|css) {
>                  root    /root2;
>          }
>
> Этот вариант лучше использовать, если /icons/ нужно задать через alias:
>
>          location /icons/ {
>                  alias    /root1;
>          }

Кстати, наверное, нужно сделать такие locations, после которых regexp'ы бы
не обрабатывались. Только вот как это обозначить ? Сейчас есть такие locations:

   location /url/         обычный
   location = /url/       точное равентсво
   location ~ /url/       регулярное выражение
   location ~* /url/      регулярное выражение без учёта регистра

Насколько интуитивно понятно выглядит такой вариант:

   location !~ /url/      обычный locaiton, для которого не нужно применять
                          регулярные выражения


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list