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