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

Maxim Dounin mdounin на mdounin.ru
Ср Сен 30 14:04:00 UTC 2020


Hello!

On Wed, Sep 30, 2020 at 03:03:01AM -0400, skeletor wrote:

> Всем привет.
> Начал замечать, что с недавних пор, (на версии 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 на новых версиях?

Поведение "упрощённого" if не менялось с nginx 1.0.1: истиной 
считаются любые значения переменной, кроме пустой строки и "0".  
Оба приведённые выше условия отлично работают, в там числе 
упрощённое:

    map $connection $is_bot { default 0; }

    map $is_bot:$uri:$http_referer $very_bad {
         default '';
         "~*0:(\/api):(.*bad\.html)" '1';
    }

    server {
        listen 8080;

        if ($very_bad) {return 403 true\n;}

        return 200 "false\n";
    }

$ curl http://127.0.0.1:8080/api
false
$ curl http://127.0.0.1:8080/api -H 'Referer: bad.html'
true

Если у вас не работает - проблема где-то ещё.

-- 
Maxim Dounin
http://mdounin.ru/


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