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
