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?

Alex Kapranoff
quelle

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.

Malayter
quelle
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;
    }
}
Vlad Frolov
quelle
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