it-swarm.com.de

Abfangen von Backend 301/302 Redirects (proxy_pass) und Umschreiben auf einen anderen Location Block möglich?

Wir haben ein paar Backends hinter unseren Nginx-Frontends.

Können 301/302-Weiterleitungen, die von diesen Backends gesendet wurden, abgefangen und von Nginx verarbeitet werden?

Wir dachten etwas allein die Zeilen von:

error_page 302 = @target;

Aber ich bezweifle, dass 301/302-Weiterleitungen genauso gehandhabt werden können wie 404-Weiterleitungen usw. Ich meine, error_page trifft wahrscheinlich nicht auf 200 usw. zu. Fehlercodes?

Um es zusammenzufassen:

Unsere Backends senden von Zeit zu Zeit 301/302s zurück. Wir möchten, dass Nginx diese abfängt und sie in einen anderen Speicherortblock umschreibt, in dem wir eine beliebige Anzahl anderer Dinge mit ihnen machen können.

Möglich?

Vielen Dank!

17
anonymous-one

Sie könnten die proxy_redirect Direktive verwenden:

http://nginx.org/de/docs/http/ngx_http_proxy_module.html#proxy_redirect

Nginx sendet weiterhin 301/302 an den Client zurück, proxy_redirect ändert jedoch den Location-Header, und der Client muss eine neue Anforderung an die im Location-Header angegebene URL stellen.

So etwas sollte die nachfolgende Anfrage zurück an nginx richten:

proxy_redirect http://upstream:port/ http://$http_Host/;

16
Tuomo Kestilä

Es ist mir gelungen, einen allgemeineren Fall zu lösen, bei dem ein Weiterleitungsort eine beliebige externe URL sein kann.

server {
    ...

    location / {
        proxy_pass http://backend;
        # You may need to uncomment the following line if your redirects are relative, e.g. /foo/bar
        #proxy_redirect / /;
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirects;
    }

    location @handle_redirects {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass $saved_redirect_location;
    }
}

Ein alternativer Ansatz, der dem, was Sie beschreiben, näher kommt, wird in der ServerFault-Antwort auf diese Frage behandelt: https://serverfault.com/questions/641070/nginx-302-redirect-resolve-internally

4
Vlad Frolov

Wenn Sie mehrere Weiterleitungen durchführen müssen, ändern Sie die Lösung von Vlad wie folgt:

1) Add 

recursive_error_pages on;

zu location /.

2) Add 

  proxy_intercept_errors on;
  error_page 301 302 307 = @handle_redirect;

zum Abschnitt location @handle_redirects.

2
drott

Mehr zu proxy_redirect für relative Standorte

Fall

location /api/ {
  proxy_pass http://${API_Host}:${API_PORT}/;
}
  • das Backend leitet an einen relativen Ort um, an dem das Präfix /api/ fehlt
  • der Browser folgt der Weiterleitung und stößt auf eine Mauer des Unverständnisses

Lösung

location /api/ {
  proxy_pass http://${API_Host}:${API_PORT}/;
  proxy_redirect ~^/(.*) http://$http_Host/api/$1;
}
0
Arnaud P