Redirecciones que degradan la conexión detrás de un proxy
Pedir una ruta sin barra final devolvía una redirección hacia una dirección sin cifrar, con el nombre interno del contenedor. El servidor de adentro hablaba en claro y no tenía forma de saberlo.
Una sección del sitio funcionaba perfecto escribiendo la dirección con barra final y fallaba sin ella. Sin barra, el navegador recibía una redirección hacia una dirección con el nombre interno del contenedor y sin cifrado.
El servidor de adentro no estaba mal configurado. Simplemente no sabía nada del mundo exterior: cuando arma una redirección absoluta, usa lo único que conoce.
Por qué un servidor arma una redirección absoluta
Hay redirecciones que el servidor genera solo, sin que nadie las escriba: la más común es agregar la barra final cuando la ruta corresponde a un directorio.
Lo que ocurre paso a paso
- El navegador pide una ruta sin barra final, por HTTPS, al dominio público.
- El proxy termina el cifrado y reenvía en claro al contenedor, con su nombre interno como destino.
- El contenedor decide redirigir agregando la barra y construye una dirección absoluta con el esquema y el host que él ve: sin cifrar, con el nombre interno.
- El navegador recibe esa redirección e intenta seguirla. Falla, o degrada la conexión.
Las dos formas de arreglarlo
| Enfoque | Cómo funciona | Cuándo conviene |
|---|---|---|
| Que el servidor interno no use direcciones absolutas | Se le indica que las redirecciones sean relativas: sólo la ruta, sin esquema ni host | Siempre que la opción exista: es la más robusta |
| Que el servidor interno sepa quién es afuera | Se reenvían el host y el esquema originales y se configura para usarlos al construir enlaces | Cuando la aplicación necesita armar enlaces absolutos igual, por ejemplo para correos |
Con la redirección relativa, el navegador completa el esquema y el host con los de la petición original, que son los correctos. Es una opción de una línea y resuelve toda la familia de casos.
La familia completa de este error
Una vez que se entiende el mecanismo, aparece en varios lugares distintos.
Dónde más se manifiesta
- Enlaces en correos generados por la aplicación, que apuntan al nombre interno y no funcionan fuera del servidor.
- Redirecciones después de autenticarse, que mandan a una dirección sin cifrar y pierden la sesión en el camino.
- Direcciones canónicas y mapas del sitio generados con el host equivocado, que afectan al posicionamiento.
- Cookies marcadas como seguras que la aplicación no manda porque cree estar en una conexión sin cifrar.
Antes de seguir, predecí
Cómo se verifica en treinta segundos
Este error es invisible en el navegador, porque sigue las redirecciones y muestra el resultado final. Hay que mirar la respuesta cruda.
Qué comprobar
- Pedir sin seguir redirecciones y leer el código y el destino. Ahí se ve si apunta al dominio público o al nombre interno.
- Probar con y sin barra final en cada ruta que corresponda a una sección.
- Comprobar el esquema del destino: tiene que ser el mismo por el que se entró.
- Revisar los enlaces de los correos que genera el sistema, que es donde el error sobrevive más tiempo sin que nadie lo note.
Más a fondo · nivel seniorConfiar en las cabeceras tiene condición
Cuando la aplicación se configura para creerle al esquema y al host reenviados, hay que asegurarse de que el único camino hacia ella sea el proxy. Si alguien puede llegarle directo, puede mandar esas cabeceras a mano y hacerle generar enlaces hacia donde quiera, que es una vía conocida de envenenamiento de enlaces. La red interna de contenedores y no publicar el puerto son lo que sostiene esa confianza.
La redirección en el log
Buscá en el log
Con barra final anda; sin barra final, el navegador termina en una dirección interna y sin cifrado. ¿Qué línea muestra de dónde sale esa dirección?
debug 4info 6warn 0error 111 de 11
El servidor de adentro armó la redirección con lo único que conoce: su propio nombre de host, su puerto y el esquema con el que le llegó el pedido, que es http porque el TLS lo termina el proxy. No está mal configurado, está incompleto: nadie le contó que del otro lado hay un nombre público y https. Eso es lo que llevan las cabeceras X-Forwarded-Proto y X-Forwarded-Host, y hay que mandarlas y además decirle al servidor que confíe en ellas. Con una sola de las dos cosas no alcanza.
Las dos mitades de la solución
Cierre
Autoevaluación
¿Lo entendiste?
Práctica