Re: Как сделать два вложенных условия в map или if
Ekaterina Kukushkina
ek на nginx.com
Пн Окт 5 20:59:51 UTC 2015
Добрый день.
А можно еще раз? А то непонятно. То "для 2 стран сделать на https с обязательным редиректом", то "надо заредиректить всех кто не 2".
А если отлвечься от непонятного описания, то такие условные мапы можно делать двумя способами.
1) с использованием регулярных выражений. Частично похоже на обработку регулярных выражений в локейшенах - сначала проверяется полное соответствие строковых значений, если ничего не совпало - проверяются регулярные выражения до первого совпадения.
В данном примере, если схема - https, а код RU или UA, то $redirect_var будет равно "0", для всех остальных https значение будет "1"
map "$scheme:$geoip_country_code" $redirect_var {
https:RU 0;
https:UA 0;
~https: 1;
}
2) без использования регулярных выражений (ищется полное соответствие независимо от его расположения в map)
map $scheme $redirect_var {
https $check_country;
}
map $geoip_country_code $check_country {
RU 0;
UA 0;
default 1;
}
А дальше уже можно писать if ($redirect_var) { ...; }. Это условие будет срабатывать в том случае, если перменная $redirect_var существует и не равна нулю.
Т.е.
для http - эта переменная не определена, поэтому условие на выполняется
для https (RU|UA) - эта переменная равна "0", поэтому условие не выполняется
остальные https - эта перменная равно "1", условие выполнится.
> On 05 Oct 2015, at 14:40, Anton Kuznetsov <maybe на arjlover.net> wrote:
>
> Добрый день!
>
> Есть server {} общий для http & https
>
> Появилась необходимость для 2 стран сделать его только на https с обязательным редиректом. Но всех остальных так же обязательно оставить на http. Так не хочется дублировать этот server {} длинный. А сделать редиректы внутри одного - истина где-то рядом, но никак не дотянуться...
> Попытался сделать как в лучших домах:
>
> http{
> map "$scheme:$geoip_country_code" $tossl {
> "https:RU" "1";
> "https:UA" "1";
> "http:RU" "2";
> "http:UA" "2";
> }}
>
> server{}
> if ($tossl = "1") {rewrite ^(.*)$ https://example.com$1 permanent;}
>
> Но вот второе правило должно работать от обратного. Надо заредиректить всех кто не "2", но внутри одного server{} это так же будет и 1. А как в map пометить все страны кроме этих двух, но с учетом схемы? Нужна снова последовательная вложенность if.
>
> Есть известный костыль:
>
> if ( $geoip_country_code !~ "RU|UA") { set $lock1 1; }
> if ( $scheme = "https" ) { set $lock2 1; }
> set $lock3 "$lock1$lock2";
> if ( $lock3 = "11" ) { rewrite ^/(.*)$ http://example.com/$1 last ; }
>
> Но он такой уродский...
>
> --
> Best regards,
> Anton Kuznetsov.
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
--
Ekaterina Kukushkina
Подробная информация о списке рассылки nginx-ru