Problem with {} in map regex matching

Maxim Dounin mdounin at mdounin.ru
Wed Oct 9 11:44:39 UTC 2013


Hello!

On Wed, Oct 09, 2013 at 01:04:46PM +0200, António P. P. Almeida wrote:

> To my surprise, apparently doing a match with {} like in:
> 
>  map $args $has_tr0_arg {
>         default 0;
> 
> ~"tr%5B0%5D%3D=[1-9][[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{2}T[[:digit:]]{2}%2F[1-9][[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{2}T[[:digit:]]{2}%26"
> 1;
> 
> ~"%26tr%5B0%5D%3D=[1-9][[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{2}T[[:digit:]]{2}%2F[1-9][[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{2}T[[:digit:]]{2}"
> 1;
>  }
> 
> Doesn't work.
> 
> Which is bit surprising knowing that location regex matching works with {},
> of course you have to quote it, like I do above.
> 
> This is what I get from nginx -t:
> 
>  nginx: [emerg] unexpected "{" in /etc/nginx/nginx.conf
> 
> Is this expected behavior or I'm doing something wrong here?

Leading '~' is outside quotes, which results in your regular 
expression being interpreted as non-quoted string.  Use something 
like this instead:

    map ... {
        "~(foo){3}" 1;
    }

-- 
Maxim Dounin
http://nginx.org/en/donation.html



More information about the nginx mailing list