Nginx add location details to URL when we stop decoding URL

Maxim Dounin mdounin at mdounin.ru
Fri Feb 13 12:59:39 UTC 2015


Hello!

On Fri, Feb 13, 2015 at 01:07:15AM -0500, malintha wrote:

> I am accessing a URL which has encode characters
> 
> http:....../malintha/tel%3A%2B6281808147137
> 
> 
> 
>    location /gateway/ {
>     proxy_set_header X-Forwarded-Host $host;
>     proxy_set_header X-Forwarded-Server $host;
>     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
>     proxy_set_header Host $http_host;
>     proxy_read_timeout 5m;
>     proxy_send_timeout 5m;
>     proxy_pass http://10.1.1.1:9443$request_uri/;
>     proxy_set_header Upgrade $http_upgrade;
>     proxy_set_header Connection "upgrade";
>     proxy_http_version 1.1;
> }
> 
> I added $request_uri at then end of the proxy_pass URL as I have to stop
> decoding by nginx.
> 
> When I configure like this nginx resolve it to (stop decoding but incorrect
> URL - adding /gateway/)
> 
> /gateway/malintha/tel%3A%2B6281808147137

What makes you think that nginx is _adding_ "/gateway/"?  As per 
the location specification, the $request_uri is expected to 
contain "/gateway/" in it.

> but When I remove $request_uri it resolve to correct URL (but with
> decoding)

With $request_uri in proxy_pass nginx will assume you've specified 
full URI yourself and it shouldn't be changed.  When you remove 
$request_uri nginx will follow it's normal logic to replace 
matching part of $uri with the URI part specified in the 
proxy_pass directive, and will encode the result as appropriate.  
See http://nginx.org/r/proxy_pass for details.

If you want nginx to preserve the encoding as it was in the 
original client request, and want to strip "/gateway/" part from 
the URI at the same time, you may do so by manually removing the 
"/gateway/" from the $request_uri variable, like this (untested):

    set $modified_uri $request_uri;

    if ($modified_uri ~ "^/gateway(/.*)") {
        set $modified_uri $1;
    }

    proxy_pass http://upstream$modified_uri;

Note though, that this will not work in some characters in the 
"/gateway/" are escaped by the client.

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



More information about the nginx mailing list