If is Evil
Васильев "Zmey!" Олег
zmey1992 at ya.ru
Mon Sep 2 00:53:03 UTC 2013
Попытаюсь вклиниться в тему. Есть давно волнующий вопрос как раз на ряду с этими if-ами. Есть какой-то список директив, которые наследуются (или не наследуются) в location-ах из уровня выше и такой же для if-ов? Был бы крайне полезный материал, т.к. в голове всё удержать не выходит.
02.09.2013, 03:42, "Maxim Dounin" <mdounin at mdounin.ru>:
> 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 at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
Подробная информация о списке рассылки nginx-ru