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-а ...