nginx seems to treat %3F as "?"

ST smntov at gmail.com
Thu Nov 23 09:24:17 UTC 2017


On Wed, 2017-11-22 at 22:11 +0000, Francis Daly wrote:
> On Wed, Nov 22, 2017 at 05:34:13PM +0200, ST wrote:
> 
> Hi there,
> 
> > I have following redirection rule defined:
> > 
> > location ~ "^/(.*)\.html[^\?]+" {
> 
> That says: /anything.html followed by one-or-more things that are not ?.
> 
> Note that "location" works on the unencoded url version, and does not
> include the ? that marks the query string, or anything after it.
> 
> >           return 301 /$1.html;
> > }
> > 
> > so that everything besides "?" after an URL gets truncated:
> 
> No.
> 
> *everything* after .html gets removed in the 301 response, provided
> that there is something immediately after .html that is not a ? (which
> would be %3F in the original url, because ? is special).
> 
> > like
> >  example.com/test.html%D1%80%D0%BE%D1%80%D0%BB -> example.com/test.html
> 
> The thing immediately after .html is the unencoded version of %D1, which is
> not ?, so the location matches and the rewrite happens.
> 
> > however it doesn't work when "?" is url encoded into %3F. I would like
> > example.com/test.html%3F to redirect to example.com/test.html
> 
> Your location block explicitly excludes that case.
> 
> Why?
> 
> As in: I do not understand what the thing that you are trying to achieve
> is. Can you explain it? Perhaps with examples of some things that should
> be rewritten and some things that should not be?
> 
> At a guess, perhaps
> 
>   location ~ ^/(.*)\.html. {
> 
> is what you want? Starts with /, includes .html, and is followed by anything.
> 
> That should match /a.htmlx and /a.html%3Fx, but not /a.html or /a.html?x=y

Thank you very much! That was exactly what I needed!



More information about the nginx mailing list