ПРОЕКТЫ 


  АРХИВ 


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]

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



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;
         }


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





 




Copyright © Lexa Software, 1996-2009.