Вложенныедирективыилиобъединениеусловий

Larry Gingras larry at cybent.net
Wed Apr 16 20:25:19 MSD 2008


Igor Sysoev пишет:
> On Wed, Apr 16, 2008 at 08:55:13PM +0800, Larry Gingras wrote:
> 
>> On Wednesday 16 April 2008 20:28, Andrey Ignatov wrote:
>>> On Wed, Apr 16, 2008 at 11:57:17AM +0000, Larry Gingras wrote:
>>>> Переписываю очень сложную и навороченную конфигурацию apache под nginx
>>>> (для реализации связки nginx+apache).
>>>> И вот например мне нужно тут в одной штуке нужно проверить несколько
>>>> условий. В apache я просто писал несколько RewriteCond подряд. Тут в
>>>> одном if несколько условий поставить нельзя. И, как оказалось, вложенные
>>>> if не поддерживаются тоже. Так что же делать в таком случае?
>>>> Вот один из примеров, который не знаю как расписать правильно:
>>>> if ($request_uri ~* \.(jpg|gif|wmv|flv)$) {
>>>> 	if ($request_uri !~ ^/webmasters/) {
>>>> 		if($invalid_referer) {
>>>> 			return 403;
>>>> 		}
>>>> 	}
>>>> }
>>> Можно попробовать что-нибудь в таком духе:
>>>
>>> if ($request_uri ~* \.(jpg|gif|wmv|flv)$) {
>>> 	set $i  "a";
>>> }
>>>
>>> if ($request_uri !~ ^/webmasters/) {
>>> 	set $i  "a$i"
>>> }
>>>
>>> if ($invalid_referer) {
>>> 	set $i  "a$i"
>>> }
>>>
>>> if ($i = "aaa") {
>>> 	return 403;
>>> }
>>>
>>> Не красиво, но др. вариантов не знаю.
>> Вот это я думаю наиболее изящное и хорошее решение
>> Потому что мне тут предлагают разбивать всё на отдельные локейшены, а учитывая 
>> что там помимо этого примера ещё мама не горюй таких вещей, то там ужас что 
>> было бы. А с таким подходом очень много локейшенов удастся сэкономить.
> 
> Это не изящное решение, а кошмраное. Если в условиях используется
> $request_uri, то это прямой кандидат в location.
> Правильное и масштабирумое с точки зрения последующего развития
> конфигурации решение предложил Roxis.
> 
> 
Эм, я рад, что вы лично ответили на мой вопрос, всё-таки ваше мнение 
наиболее авторитетно :)
В первую очередь хочу спросить, будет ли такой вариант работать вообще. 
Потому что с точки зрения простоты конвертации конструкции 
RewriteCond...RewriteRule в конфиг nginxа это самое простое и 
прямолинейное решение. Операторов && и || для условий в if всё-таки 
сильно не хватает :)
Ну а по существу вопроса - я не вижу масштабируемости в создании конфига 
в виде огромного количества location на все случаи жизни. Это ведь 
только один самый простой пример вещей, используемых в моей 
конфигурации, а там ещё много чего построенного на реврайте апача 
(причем с активным применением различных условий, SetEnvIf и подобного). 
Получается каждая такая фича будет увеличивать количество location в 
геометрической прогрессии практически, а при необходимости каких-нибудь 
изменений мне придется менять один и тот же код в огромном количестве 
копий (что вообще говоря нарушает принципе reuse code), плюс у меня 
далеко не один сайт имеет сходную конфигурацию (но довольно сильно 
отличающуюся именно в нюансах).
С точки зрения всего вышеописанного этот подход кажется мне наиболее 
оптимальным.





More information about the nginx-ru mailing list