Wie verfolge ich HTTP-Weiterleitungen in nginx?


15

Ich habe einen Nginx-basierten HTTP-Proxy und möchte alle darin enthaltenen HTTP-Weiterleitungen verarbeiten, sodass Clients nur die letzte Antwort in der Weiterleitungskette erhalten.

Der Basiscode sieht wie folgt aus:

location /proxy {
    rewrite ^/proxy/([^/]+) $1 break;

    proxy_pass http://$uri/;
}

Mein Versuch, 1 Level-Weiterleitungen zu folgen, ist folgender:

error_page 301 302 307 =200 @redir;

... und diesen benannten Ort haben:

location @redir {
    proxy_pass $proxy_location;
}

Es gibt nur keine $ proxy_location-Variable und ich habe keine Möglichkeit gefunden, sie zu erstellen. Es sollte den Wert des Location:vom Upstream empfangenen Headers enthalten .

Irgendwelche Gedanken?

Antworten:


7

Ich glaube, Sie möchten die Variable $ upstream_http_location .

Variablen, die mit $ proxy * beginnen, steuern, was von Nginx nach Upstream geht. Die Variablenreihe $ upstream * enthält Informationen über die Antwort, die nginx selbst erhält. Sie können jeden beliebigen HTTP-Header von einem Upstream-Server mit dem Namen $ upstream_http_headername erhalten.

Beachten Sie, dass diese $ upstream-Variablen nichts anderes als null sein können, bis die Antwort vom Upstream-Server empfangen wird. Daher gibt es einige Einschränkungen bei ihrer Verwendung.


26

Hier ist das vollständige Beispiel dafür, was bei mir funktioniert hat:

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_redirect;
    }

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

1
Warum mussten Sie den Wert von $ upstream_http_location in einer neuen Variablen speichern?
— Parth Shah

1
Ich kenne den genauen Grund nicht, aber sonst funktioniert es nicht ...
— Vlad Frolov

Das ist großartig, fängt aber nur eine einzige Weiterleitung ab. Wie können mehrere Weiterleitungen behandelt werden?
— ThiefMaster

1
@ThiefMaster Ich glaube, diese Antwort ist genau das, wonach Sie suchen.
— iBug

Ich 2020/01/23 09:17:46 [error] 1394#0: *1 invalid URL prefix in "", client: xx.xx.28.3, server: www.example.com, request: "GET /test HTTP/1.1", host: "www.example.com"erhalte die folgende Fehlermeldung mit dem @ handle_redirect-Block. Irgendeine Idee?
— Cyril Duchon-Doris
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.