¿Cómo seguir los redireccionamientos HTTP dentro de nginx?

15

Tengo un proxy HTTP basado en nginx y me gustaría procesar todos los redireccionamientos HTTP dentro de él para que los clientes obtengan solo la última respuesta en la cadena de redireccionamiento.

El código básico se ve así:

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

    proxy_pass http://$uri/;
}

Mi intento de seguir las redirecciones de 1 nivel es este:

error_page 301 302 307 =200 @redir;

... y tener esta ubicación con nombre:

location @redir {
    proxy_pass $proxy_location;
}

Solo que no hay una variable $ proxy_location y no pude encontrar una manera de crearla. Debe contener el valor del Location:encabezado recibido de la parte superior.

¿Alguna idea?

Alex Kapranoff
fuente

Respuestas:

7

Creo que quieres la variable $ upstream_http_location .

Las variables que comienzan con $ proxy * controlan lo que va de nginx a upstream. La serie de variables $ upstream * contiene información sobre la respuesta que recibe nginx. Puede obtener cualquier encabezado HTTP arbitrario recibido de un servidor ascendente con $ upstream_http_headername.

Tenga en cuenta que estas variables ascendentes $ no pueden ser más que nulas hasta que se reciba la respuesta del servidor ascendente, por lo que existen algunas limitaciones en su uso.

rmalayter
fuente
26

Aquí está el ejemplo completo de lo que funcionó para mí:

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
fuente
1
¿Por qué tuvo que guardar el valor de $ upstream_http_location en una nueva variable?
Parth Shah
1
No sé la razón exacta, pero no funciona de otra manera ...
Vlad Frolov
Esto es genial, pero solo detecta una única redirección. ¿Alguna forma de manejar múltiples redirecciones?
ThiefMaster
1
@ ThhiefMaster Creo que esta respuesta es lo que estás buscando.
iBug
Recibo el siguiente error al 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"usar el bloque @handle_redirect, ¿alguna idea?
Cyril Duchon-Doris