If is Evil
Maxim Dounin
mdounin at mdounin.ru
Sun Sep 1 23:42:31 UTC 2013
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