Re: Изменения в блоке if

Fedor Dikarev fe на hamilton.rinet.ru
Ср Сен 30 08:40:51 UTC 2020


у меня вот так работает:
> map $request_uri $bad {
>         default '';
>         /string '1';
>         /number 1;
>         /zero_one '01';
>         /one_space '1 ';
>         /space_one ' 1';
>         /zero '0';
> }
> ...
>         if ($bad) { return 403 "$bad"; }

> [fe на hamilton ~]$ for loc in string number zero_one one_space space_one; do curl -w " %{http_code}\n" https://test.host/$loc; done
> 1 403
> 1 403
> 01 403
> 1  403
>  1 403

Как-раз на части случаев тут if ($bad = '1') перестает работать. Но 
придумать кейс в обратную сторону у меня пока не получилось.

Я бы ради дебага добавил бы локейшен, где бы поставил return 202 
"$very_bad" и посмотрел какое значение там получается.

p.s.
> nginx version: nginx/1.19.2 built with OpenSSL 1.1.1g  21 Apr 2020


30.09.2020 10:03, skeletor пишет:
> Всем привет.
> Начал замечать, что с недавних пор, (на версии 1.19.1 точно, и, скорее всего
> на 1.17.Х) поведение if поменялось. При этом в документации (что en, что ru
> - одинаково) сказано, что такая конструкция будет работать:
> 
> if ($slow) {
>      limit_rate 10k;
> }
> 
> но на практике нужно писать
> 
> if ($slow = 1) {
>      limit_rate 10k;
> }
> 
> иначе не работает.
> 
> Могу привести конкретный пример, где у меня не работает "упрощенный" (то
> есть без сравнения с 1) if:
> 
> map $is_bot:$uri:$http_referer $very_bad {
>           default '';
>           "~*0:(\/api):(.*bad\.html)" '1';
>           }
> 
> ...
> if ($very_bad = 1) {return 403;}
> 
> Именно так работает. Если же указать
> 
> if ($very_bad) {return 403;}
> 
> то не работает.
> 
> Есть такие, у которых нормально работает "упрощённый" if на новых версиях?
> 
> Posted at Nginx Forum: https://forum.nginx.org/read.php?21,289612,289612#msg-289612
> 
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
> 


Подробная информация о списке рассылки nginx-ru