Como seguir redirecionamentos HTTP dentro do nginx?

15

Eu tenho um proxy HTTP baseado em nginx e gostaria de processar todos os redirecionamentos HTTP dentro dele para que os clientes obtenham apenas a última resposta na cadeia de redirecionamento.

O código básico se parece com:

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

    proxy_pass http://$uri/;
}

Minha tentativa de seguir os 1 redirecionamentos de nível é a seguinte:

error_page 301 302 307 =200 @redir;

... e tendo este local nomeado:

location @redir {
    proxy_pass $proxy_location;
}

Somente não há variável $ proxy_location e não consegui encontrar uma maneira de criá-la. Ele deve conter o valor do Location:cabeçalho recebido do upstream.

Alguma ideia?

Alex Kapranoff
fonte

Respostas:

7

Eu acredito que você deseja a variável $ upstream_http_location .

Variáveis ​​que começam com $ proxy * controlam o que vai do nginx ao upstream. A série de variáveis ​​$ upstream * contém informações sobre a resposta que o próprio nginx recebe. Você pode obter qualquer cabeçalho HTTP arbitrário recebido de um servidor upstream com $ upstream_http_headername.

Observe que essas variáveis ​​$ upstream não podem ser nada além de nulas até que a resposta seja recebida do servidor upstream, portanto, existem algumas limitações em seu uso.

rmalayter
fonte
26

Aqui está o exemplo completo do que funcionou para mim:

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
fonte
1
Por que você precisou salvar o valor de $ upstream_http_location em uma nova variável?
precisa
1
Eu não sei a razão exata, mas ele não funciona de outra maneira ...
Vlad Frolov
Isso é ótimo, mas apenas captura um redirecionamento. Alguma maneira de lidar com vários redirecionamentos?
ThiefMaster 18/10/19
1
@ThiefMaster Acredito que esta resposta é o que você está procurando.
iBug 24/10/19
Estou recebendo o seguinte erro 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 o bloco @handle_redirect, alguma ideia?
Cyril Duchon-Doris