Попытаюсь вклиниться в тему. Есть давно волнующий вопрос как раз на ряду с этими if-ами. Есть какой-то список директив, которые наследуются (или не наследуются) в location-ах из уровня выше и такой же для if-ов? Был бы крайне полезный материал, т.к. в голове всё удержать не выходит.
02.09.2013, 03:42, "Maxim Dounin" <[email protected]>: > 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 > [email protected] > http://mailman.nginx.org/mailman/listinfo/nginx-ru _______________________________________________ nginx-ru mailing list [email protected] http://mailman.nginx.org/mailman/listinfo/nginx-ru
