порядок обработки 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