Matching of special characters in location

Grzegorz Kulewski gk at leniwiec.biz
Tue Nov 10 01:54:26 UTC 2020


W dniu 10.11.2020 o 01:19, Francis Daly pisze:
> On Tue, Nov 10, 2020 at 12:11:28AM +0100, Grzegorz Kulewski wrote:
>> W dniu 09.11.2020 o 21:10, Sergey A. Osokin pisze:
>>> On Mon, Nov 09, 2020 at 03:47:13PM +0100, Grzegorz Kulewski wrote:
>>>> Is there any (sane) way to match things like: %e2%80%8b in URL in location?
> 
>>> here is the code snippet (not tested):
>>>
>>> location ~ ^/\xE2\x80\x8E {
>>>     return 200 "%e2%80%8b matched\n"/;
>>> }
>>
>> Thank you. It works.
>>
>> They key seems to be using regexp match. Regular match doesn't seem to understand escapes. Not sure if (where) it is documented.
> 
> Regex match is straightforward here -- you use whatever your regex-engine
> supports to match the octets, which probably includes a straight swap
> of \x for % from the url.
> 
> Non-regex match does work too, though; the key there is that nginx does
> that match against the non-url-encoded characters.

This is documented.


> In my case, it displays as <200b> and represents a single character.
> 
> So my config file can include (e.g.)
> 
>   location ^~/<200b> { return 200 "match /zwsp ($uri, $request_uri)\n"; }
> 
> (except there is only one "character" between the / and the space);
> and then any request that starts with /%e2%80%8b should be handled in
> that location; and any request that does not, should not be.

Including raw UTF-8 special characters in nginx config isn't my ideal sane solution. :)

I think I would prefer to be able to use escapes in non-regexp matches too...

-- 
Grzegorz Kulewski



More information about the nginx mailing list