ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: порядок обработки location s



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





 




Copyright © Lexa Software, 1996-2009.