Вложенныедирективыилиобъединениеусловий
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