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

Alexey V. Karagodov kav at karagodov.name
Thu Apr 17 12:24:09 MSD 2008


On 16.04.2008, at 20:25, Larry Gingras wrote:

> 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), плюс у меня далеко не один сайт имеет сходную  
> конфигурацию (но довольно сильно отличающуюся именно в нюансах).
> С точки зрения всего вышеописанного этот подход кажется мне наиболее  
> оптимальным.
>

в таком случае и в примере надо было по-больше написать, а не три  
одиноких вложенных if-а ...



More information about the nginx-ru mailing list