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