у меня вот так работает:
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