rewrite causing $ to be escaped

Maxim Dounin mdounin at mdounin.ru
Tue Dec 15 01:25:45 UTC 2015


Hello!

On Mon, Dec 14, 2015 at 04:26:33PM -0800, Sunil Shah wrote:

> We're running Jenkins behind an Nginx reverse proxy and see issues where
> Jenkins running in Tomcat returns 404 because it receives URLs that have $
> encoded as %24. From the Tomcat logs:
> 10.0.7.212 - - [15/Dec/2015:00:15:22 +0000] "POST
> /%24stapler/bound/c43ae9fc-dcca-4fbe-b247-82279fa65d55/render HTTP/1.0" 404
> 992
> 
> If we access Tomcat directly, it does not return a 404 and $ is not encoded:
> 10.0.7.212 - - [15/Dec/2015:00:16:54 +0000] "POST
> /$stapler/bound/95ed7e0f-f703-458a-a456-8bf729670a4a/render HTTP/1.1" 200
> 437
> 
> When I log the $request_uri and $uri variables, it doesn't look like the $
> is being encoded:
> Dec 15 00:15:22 ip-10-0-7-212.us-west-2.compute.internal nginx[2732]:
> ip-10-0-7-212.us-west-2.compute.internal nginx: [15/Dec/2015:00:15:22
> +0000] Hi Sunil! Request URI:
> /service/jenkins/$stapler/bound/c43ae9fc-dcca-4fbe-b247-82279fa65d55/render
> is now URI: /$stapler/bound/c43ae9fc-dcca-4fbe-b247-82279fa65d55/render
> 
> However, it looks like the rewrite rule in our location block is causing
> the $ to be encoded. If I comment out this block or change the regex so it
> doesn't match, this works.
> 
> Here's the relevant configuration block:
> location ~ ^/service/jenkins/(?<path>.*) {
>             rewrite ^/service/jenkins/?.*$ /$path break;

The '$' character isn't encoded by nginx on rewrites.  If you see 
it encoded - probably something else did it.  Just tested it here, 
and such a configuration sends the following request line to 
upstream server:

GET /$stapler/bound/c43ae9fc-dcca-4fbe-b247-82279fa65d55/render HTTP/1.0

That is, '$' is not escaped.

If in doubt, try looking into debug logs to see what nginx 
actually sent to upstream server, see 
http://nginx.org/en/docs/debugging_log.html for details.

Note well that better solution for such URI change would be to use 
static location and proxy_pass with URI component, like this:

    location /service/jenkins/ {
        proxy_pass http://10.0.0.63:10115/;
        ...
    }

(Note tralinig "/" in proxy_pass.)

No rewrites, no regular expressions, the same result.  May need 
adjustments if you use other conflicting regular expressions in 
your config.  See http://nginx.org/r/location for details on 
location matching, and http://nginx.org/r/proxy_pass for details 
on proxy_pass.

[...]

-- 
Maxim Dounin
http://nginx.org/



More information about the nginx mailing list