Configuring Nginx reverse proxy with backend redirection

I’m struggling to set up Nginx as a reverse proxy when the backend does a redirect. Here’s what I’m trying to do:

domain/foo -> domain:80

This config works fine:

location /foo/ {
  proxy_pass         http://domain:80/;
  proxy_set_header   Host $host;
}

But if domain:80 redirects to domain/bar, I tried this:

location /foo/ {
  proxy_pass         http://domain:80/bar/;
  proxy_set_header   Host $host;
}

Now I get a 404 error for anything under domain:80/bar/obj1.

Is there a way for Nginx to detect the backend redirect automatically? I’d rather not hardcode ‘bar/’ in the proxy_pass. Any ideas on how to fix this?

I’ve encountered similar issues with Nginx reverse proxying and backend redirects. One approach that’s worked well for me is using the proxy_redirect directive. Instead of hardcoding the redirect path, you can tell Nginx how to rewrite the Location header. Try something like this:

location /foo/ {
    proxy_pass http://domain:80/;
    proxy_set_header Host $host;
    proxy_redirect http://domain:80/bar/ /foo/;
}

This configuration tells Nginx to rewrite any redirects from http://domain:80/bar/ to /foo/. It’s more flexible and doesn’t require you to predict all possible redirect paths. If you’re dealing with multiple potential redirects, you might need to add more proxy_redirect lines. Also, ensure your backend isn’t using absolute URLs in its redirects, as that can complicate things further.

have u tried using proxy_redirect? it can help with those pesky backend redirects. something like:

location /foo/ {
proxy_pass http://domain:80/;
proxy_set_header Host $host;
proxy_redirect http://domain:80/ /foo/;
}

might do the trick. it tells nginx to rewrite redirects from the backend to match ur desired url structure

hmmm, interesting problem! have u considered using the X-Accel-Redirect header? it lets ur backend control the redirection more directly. maybe somethin like:

location /foo/ {
proxy_pass http://domain:80/;
proxy_set_header X-Original-URI $request_uri;
}

then ur backend can send X-Accel-Redirect header for internal redirects. just a thought! how’s that sound?