ПРОЕКТЫ 


  АРХИВ 


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: If is Evil


  • To: nginx-ru@xxxxxxxxx
  • Subject: Re: If is Evil
  • From: Maxim Dounin <mdounin@xxxxxxxxxx>
  • Date: Mon, 2 Sep 2013 03:42:31 +0400
  • In-reply-to: <CAK1EO=WJmRTg9-JzG9fLu=zyfX363yYBFtSQOruMQC-DDu-y8Q@mail.gmail.com>
  • References: <CAK1EO=WJmRTg9-JzG9fLu=zyfX363yYBFtSQOruMQC-DDu-y8Q@mail.gmail.com>

Hello!

On Sun, Sep 01, 2013 at 09:31:35PM +0300, Андрей Середенко wrote:

> Приветы всем!
> 
> Тысячи раз уже слышал, что использовать if в location КРАЙНЕ не
> рекомендуется, и что использовать его там можно только в купе с return или
> rewrite..last, но - все же хочется разобраться, КАК он отрабатывает и
> почему.
> 
> Пару рабочих дней было потрачено на то, чтобы разобраться, как оно
> работает. Но в итоге выяснилось, что сишку я уже неприлично подзабыл, а все
> гуглы мира ведут на 3 ссылки:
> 
>     http://wiki.nginx.org/IfIsEvil
>     http://habrahabr.ru/post/74135/
>     http://agentzh.blogspot.com/2011/03/how-nginx-location-if-works.html
> 
> Но в первой кроме лирики толком ничего не сказано, вторая просто с первого
> же примера плавит мозг, а в последней уже куда по-лучше, примеров
> несколько.. но все одно - какой принцип отработки не ясно(
> 
> Ребят, может кто может подробно и последовательно разжевать, КАК это
> работает? А то пока получалось обходиться без if'ов, но кто его знает, что
> будет завтра.. не хотелось бы оставить новый след от граблей, старый только
> вот зажил... да и выяснить причину раз и навсегда куда полезнее, чем просто
> запомнить постулат "скажем if в location - НЕТ"
> 
> Буду признателен за любые ответы. Спасибо!

В первую голову - надо уяснить для себя, что if создаёт вложенный 
location.  И именно в этом location'е в результате будет обработан 
запрос, если if выполнется.  Если таких if'ов много - то запрос 
будет обработан в последнем if'е, который выполнится.  Поэтому 
конфигурация вида

    location / {
        set $true 1;

        if ($true) {
            add_header X-Foo1 "bar";
        }

        if ($true) {
            add_header X-Foo2 "bar";
        }
    }

добавит только один заголовок, X-Foo2.  Эта особенность - что 
называется, не баг, а фича.

А дальше начинаются костыли, подпорки, и прочие нюансы, связанные, 
в первую очередь, с тем, что if'ы, в отличие от обычных вложенных 
location'ов, пытаются наследовать директивы, которые в норме не 
наследуются во вложенные location'ы (e.g., proxy_pass).  Иногда 
это получается, иногда - получается, но неправильно, иногда - не 
получается вовсе.  Конкретные известные случаи нехорошего 
поведения - коллекционируются на страничке IfIsEvil.

-- 
Maxim Dounin
http://nginx.org/en/donation.html

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru

  • References:
    • If is Evil
      • From: Андрей Середенко

 




Copyright © Lexa Software, 1996-2009.