11

Wir haben ein paar Backends hinter unseren Nginx-Frontends.Abfangen von Backend 301/302 Redirects (Proxy_pass) und Neuschreiben in einen anderen Standort Block möglich?

Ist es möglich 301/302 Redirects, die von diesen Backends gesendet werden, abzufangen und nginx diese zu behandeln?

Wir waren Thinging etwas allein die Linien:

error_page 302 = @target; 

Aber ich bezweifle, 301/302 Umleitungen das gleiche wie 404 des etc etc behandelt werden kann ... ich meine, error_page tut wahrscheinlich bis 200 gelten, usw. Fehlercodes?

Um es zusammenzufassen:

Unsere Backends senden einmal in eine Weile 301/302s zurück. Wir möchten, dass nginx diese abfängt und sie in einen anderen Standortblock umschreibt, wo wir eine Menge anderer Dinge mit ihnen machen könnten.

Möglich?

Danke!

Antwort

10

könnten Sie proxy_redirect Direktive verwenden:

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

Nginx noch 301/302 an den Client zurück, aber proxy_redirect wird ändern Location Header und der Kunde sollte eine neue Anforderung an die URL in der Location gegeben machen Header.

So etwas sollte die nachfolgende Anforderung zu nginx machen zurück:

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

2

ich es gelungen, einen allgemeineren Fall bei der Lösung, wenn eine Umleitung Lage jede 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; 
    } 
} 

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

0

Wenn Sie mehrere Umleitungen folgen müssen, ändern Vlads Lösung wie folgt:

1) Füge

recursive_error_pages on; 

zu location / hinzu.

2) hinzufügen

proxy_intercept_errors on; 
    error_page 301 302 307 = @handle_redirect; 

zum location @handle_redirects Abschnitt.