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