ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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



 




Copyright © Lexa Software, 1996-2009.