Search code examples
parametersnginx

How can query string parameters be forwarded through a proxy_pass with nginx?


upstream apache {
   server 127.0.0.1:8080;
}
server{
   location ~* ^/service/(.*)$ {
      proxy_pass http://apache/$1;
      proxy_redirect off;
   }
 }

The above snippet will redirect requests where the url includes the string "service" to another server, but it does not include query parameters.


Solution

  • From the proxy_pass documentation:

    A special case is using variables in the proxy_pass statement: The requested URL is not used and you are fully responsible to construct the target URL yourself.

    Since you're using $1 in the target, nginx relies on you to tell it exactly what to pass. You can fix this in two ways. First, stripping the beginning of the uri with a proxy_pass is trivial:

    location /service/ {
      # Note the trailing slash on the proxy_pass.
      # It tells nginx to replace /service/ with / when passing the request.
      proxy_pass http://apache/;
    }
    

    Or if you want to use the regex location, just include the args:

    location ~* ^/service/(.*) {
      proxy_pass http://apache/$1$is_args$args;
    }