Home > OS >  Correct way to remove path from location in nginx with proxy pass
Correct way to remove path from location in nginx with proxy pass

Time:02-15

I currently have the following configuration to proxy requests off a single domain to multiple backends:

    server {
    listen 80;
      location /team/app1/location/region/ {
        proxy_pass https://this.is.the.backend.app.example/path1/healthcheck;
    }
      location /team/app2/location/region/ {
        proxy_pass https://this.is.the.backend.app.example/path2/healthcheck;
    }
      location /team/app3/location/region/ {
        proxy_pass https://this.is.the.backend.app.example/path3/healthcheck;
    }
}

The paths are pretty arbitrary, essentially I just want to be able to proxy from:

https://proxydomain.com/team/app1/location1/region 

To:

https://this.is.the.backend.app.example/path3/healthcheck

So

/team/app1/location1/region

Would need to be stripped from the request and just proxy the request to the intended backend. I assume the path is being appended in someway as I just get 404s...

I can pass to a domain without trailing path like so - but when I try and proxy to a domain with trailing paths it gets complicated:

    server {
    listen 80;
    location /one {
        proxy_pass http://x.x.x.x/;
    }
    location /two {
        proxy_pass http://x.x.x.x/;
    }
}

I have tried the following configuration too - to try and rewrite the url:

    rewrite ^/team/app3/location/region/(.*)$ $1 break;

Hopefully it makes sense what I am trying to achieve - any guidance would be greatly appreciated.

Thanks

CodePudding user response:

You were on the right track. The rewrite will look like:

location /team/app3/location/region/ {
  rewrite ^/team/app1/location/region/(.*)$ /path3/$1 break;
  proxy_pass https://this.is.the.backend.app.example/;
}

You should add the new path path3 in the rewrite rule. With this NGINX will rewrite the $uri and append it to the proxy_pass. In case app3 and path3 are a fixed pattern you can tune the location block as well as the rewrite to simplify your configuration. But I would generally start with the approach mentioned above.

AND we keep in mind. Regex matching in locations will consume CPU. So sometimes it is better to have them fixed / static. Especially if you are using them in health checks and query them every 5s or so.

CodePudding user response:

Thanks for that - definitely helped getting me down the correct track:

In the end the working config was:

    location /team/app3/location/region {
    rewrite ^/team/app3/location/region(.*) /path3/healthcheck$1 break;
    proxy_pass https://this.is.the.backend.app.example;
}

Which correctly proxied through to:

https://this.is.the.backend.app.example/path3/healthcheck
  • Related