Tuesday, October 29, 2019

rewrite - Disabling URL decoding in nginx proxy



When I browse to this URL: http://localhost:8080/foo/%5B-%5D server (nc -l 8080) receives it as-is:



GET /foo/%5B-%5D HTTP/1.1


However when I proxy this application via nginx (1.1.19):




location /foo {
proxy_pass http://localhost:8080/foo;
}


The same request routed through nginx port is forwarded with path decoded:



GET /foo/[-] HTTP/1.1



Decoded square brackets in the GET path are causing the errors in the target server (HTTP Status 400 - Illegal character in path...) as they arrive un-escaped.



Is there a way to disable URL decoding or encode it back so that the target server gets the exact same path when routed through nginx? Some clever URL rewrite rule?


Answer



Quoting Valentin V. Bartenev (who should get the full credit for this answer):




A quote from documentation:






  • If proxy_pass is specified with URI, when passing a request to the server, part of a normalized request URI matching the location is replaced by a URI specified in the directive


  • If proxy_pass is specified without URI, a request URI is passed to the server in the same form as sent by a client when processing an original request





The correct configuration in your case would be:



location /foo {

proxy_pass http://localhost:8080;
}


No comments:

Post a Comment

linux - How to SSH to ec2 instance in VPC private subnet via NAT server

I have created a VPC in aws with a public subnet and a private subnet. The private subnet does not have direct access to external network. S...