una redirecciones redireccionar redireccionamiento que pagina otro otra htaccess generador dominio redirect nginx http-status-code-301 reverse-proxy http-status-code-302

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 .