Search code examples
nginxproxypass

NGINX proxy pass a portion of the request URL


I would like to do the following in my NGINX configuration: I want to proxy pass the path and query parameters but not include the first path parameter (path1).

Request URL

https://my-domain.com/path1/path2?query1=some-query

I want this to proxy_pass to

http://localhost:8000/path2?query1=some-query

I have tried with the following location block

location /path1/path2/ {
  proxy_pass http://localhost:8000$request_uri;
  proxy_http_version 1.1;
}

However, this does not go to the correct endpoint because I think it includes the path1 parameter too. I have several different path2 routes and so I want to be able to catch and redirect them all easily - without having to manually define each one like this:

location /path1/path2a/ {
  proxy_pass http://localhost:8000/path2a?query1=some-query;
  proxy_http_version 1.1;
}

location /path1/path2b/ {
  proxy_pass http://localhost:8000/path2b?query1=some-query;
  proxy_http_version 1.1;
}

location /path1/path2c/ {
  proxy_pass http://localhost:8000/path2c?query1=some-query;
  proxy_http_version 1.1;
}

ADDITIONAL EDIT:

I also cannot simply do

location /path1/ {
  proxy_pass http://localhost:8000/;
  proxy_http_version 1.1;
}

because I already have the location /path1/ block that gets upgraded to a WebSocket connection at a different endpoint:

location /path1/ {
  proxy_pass http://localhost:9000/;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
}

I have searched a lot online but cannot find a configuration that works for my specific scenario.


Solution

  • This is really simple:

    location /path1/ {
        proxy_pass http://localhost:8000/;
        proxy_http_version 1.1;
    }
    

    Read this Q/A for details.

    Update

    This solution isn't usable after OP clarifies his question.

    If all of the additional paths share common suffix path2:

    location /path1/path2 {
        rewrite ^/path1(.*) $1 break; # remove '/path1' URI prefix
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
    }
    

    If they aren't, replace location /path1/path2 with location ~ ^/path1/(?:path2a|path2b|path2c).

    If you need to pass to the backend query arguments that are different from those came with the request, use

    set $args query1=some-query;
    

    within the location block.