у меня вот так работает:
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
[email protected]
http://mailman.nginx.org/mailman/listinfo/nginx-ru

_______________________________________________
nginx-ru mailing list
[email protected]
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить