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