Come seguire i reindirizzamenti HTTP all'interno di nginx?


15

Ho un proxy HTTP basato su nginx e vorrei elaborare tutti i reindirizzamenti HTTP al suo interno in modo che i client ottengano solo l'ultima risposta nella catena di reindirizzamento.

Il codice di base è simile a:

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

    proxy_pass http://$uri/;
}

Il mio tentativo di seguire i reindirizzamenti di 1 livello è questo:

error_page 301 302 307 =200 @redir;

... e con questa posizione denominata:

location @redir {
    proxy_pass $proxy_location;
}

Solo che non esiste una variabile $ proxy_location e non sono riuscito a trovare un modo per crearlo. Dovrebbe contenere il valore Location:dell'intestazione ricevuta dall'upstream.

qualche idea?

Risposte:


7

Credo che tu voglia la variabile $ upstream_http_location .

Le variabili che iniziano con $ proxy * controllano ciò che va da nginx a monte. La serie di variabili $ upstream * contiene informazioni sulla risposta che nginx stesso riceve. Puoi ottenere qualsiasi intestazione HTTP aribitrary ricevuta da un server upstream con $ upstream_http_headername.

Nota che queste variabili $ upstream non possono essere altro che null fino a quando la risposta non viene ricevuta dal server upstream, quindi ci sono alcune limitazioni sul loro utilizzo.


26

Ecco l'esempio completo di ciò che ha funzionato per me:

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
Perché hai dovuto salvare il valore di $ upstream_http_location in una nuova variabile?
Parth Shah,

1
Non conosco il motivo esatto, ma altrimenti non funziona ...
Vlad Frolov,

Questo è fantastico ma cattura solo un singolo reindirizzamento. Un modo per gestire reindirizzamenti multipli?
ThiefMaster,

1
@ThiefMaster Credo che questa risposta sia ciò che stai cercando.
iBug

Ricevo il seguente errore 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"usando il blocco @handle_redirect, qualche idea?
Cyril Duchon-Doris,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.