Como seguir os redirecionamentos HTTP dentro do nginx?

10

Eu tenho um proxy HTTP baseado em nginx e gostaria de processar todos os redirecionamentos HTTP dentro dele para que os clientes recebam 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 redirecionamentos de 1 nível é esta:

error_page 301 302 307 =200 @redir;

... e tendo este local nomeado:

location @redir {
    proxy_pass $proxy_location;
}

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

Alguma opinião?

    
por Alex Kapranoff 31.08.2012 / 14:40

2 respostas

6

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.

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

    
por 31.08.2012 / 14:57
17

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;
    }
}
    
por 26.07.2016 / 16:44

Tags