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

Igor Sysoev is at rambler-co.ru
Tue Nov 16 09:50:14 MSK 2004


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





More information about the nginx-ru mailing list