redirect - redirecciones - redireccionar una pagina web a otro dominio
¿Es posible interceptar redirecciones 301/302(proxy_pass) y volver a escribir en otro bloque de ubicación? (4)
Tenemos un par de backends sentados detrás de nuestros frontales nginx.
¿Es posible interceptar redirecciones 301/302 enviadas por estos backends y tener nginx manejarlas?
Estábamos pensando en algo solo las líneas de:
error_page 302 = @target;
Pero dudo que las redirecciones 301/302 puedan manejarse de la misma manera que las de 404, etc, etc ... Quiero decir, error_page probablemente no se aplica a 200, ¿códigos de error, etc.?
Así que para resumir:
Nuestros backends envían 301 / 302s de vez en cuando. Nos gustaría que nginx los intercepte, y los reescriba en otro bloque de ubicación, donde podamos hacer cualquier otra cosa con ellos.
¿Posible?
¡Gracias!
Logré resolver un caso más genérico cuando una ubicación de redireccionamiento puede ser cualquier URL externa.
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_redirects;
}
location @handle_redirects {
set $saved_redirect_location ''$upstream_http_location'';
proxy_pass $saved_redirect_location;
}
}
El enfoque alternativo, que está más cerca de lo que describe, está cubierto en la respuesta de ServerFault a esta pregunta: https://serverfault.com/questions/641070/nginx-302-redirect-resolve-internally
Más sobre proxy_redirect
, para ubicaciones relativas
Caso
location /api/ {
proxy_pass http://${API_HOST}:${API_PORT}/;
}
- el backend redirige a una ubicación relativa, que omite el prefijo
/api/
- El navegador sigue la redirección y golpea un muro de incomprensión.
Solución
location /api/ {
proxy_pass http://${API_HOST}:${API_PORT}/;
proxy_redirect ~^/(.*) http://$http_host/api/$1;
}
Podrías usar la directiva proxy_redirect
:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect
Nginx seguirá devolviendo 301/302 al cliente, pero proxy_redirect
modificará el encabezado de la Location
y el cliente debe realizar una nueva solicitud a la URL indicada en el encabezado de la Location
.
Algo como esto debería hacer la solicitud posterior de nuevo a nginx:
proxy_redirect http://upstream:port/ http://$http_host/;
Si necesita seguir varios redireccionamientos, modifique la solución de Vlad de la siguiente manera:
1) Añadir
recursive_error_pages on;
a la location /
.
2) Añadir
proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirect;
a la sección de location @handle_redirects
.