El proxy que mandaba la ruta equivocada
Una aplicación servida bajo un prefijo devolvía 404 en todo menos la home. El proxy reenviaba correctamente y la barra final cambiaba el significado de la regla. Cómo se depura un problema que sólo existe con el proxy en el medio.
Una aplicación que funciona perfecto en su contenedor deja de funcionar cuando se la publica bajo un prefijo de ruta. La página principal carga; todo lo demás da 404, o carga sin estilos.
No hay nada roto en la aplicación. Lo que cambió es que, en el camino, alguien reescribe la ruta, y la aplicación recibe algo distinto de lo que el navegador pidió.
El detalle que cambia todo: la barra final
En la mayoría de los proxies, que el destino termine o no en barra decide si el prefijo se recorta o se conserva. Es una diferencia de un carácter con dos comportamientos opuestos.
| Configuración | El navegador pide | La aplicación recibe |
|---|---|---|
| Destino sin barra final | /app/clientes | /app/clientes |
| Destino con barra final | /app/clientes | /clientes |
De ahí salen los dos síntomas clásicos. Si la aplicación no sabe del prefijo y no se lo recortás, no encuentra ninguna ruta. Si la aplicación sí lo sabe y se lo recortás, genera enlaces con el prefijo hacia rutas que ella misma ya no reconoce.
Por qué la home carga y el resto no
El síntoma de “carga sin estilos” tiene una causa propia: las referencias absolutas.
La secuencia
- El documento se pide bajo el prefijo y llega bien.
- Adentro hay referencias a recursos que empiezan con barra: sin el prefijo.
- El navegador las pide desde la raíz del dominio.
- Ahí no hay nada, o hay otra aplicación. Los recursos dan 404 y la página se ve sin estilos ni comportamiento.
Lo otro que se pierde en el camino
Además de la ruta, hay información que la aplicación necesita y que sólo el proxy conoce.
Lo que hay que reenviar
- El host original. Sin él, la aplicación arma enlaces con el nombre interno del contenedor.
- El esquema original. El proxy habla en claro con la aplicación; si ésta no sabe que afuera es cifrado, genera redirecciones que degradan la conexión.
- La IP del cliente. Lo que ve la aplicación es la IP del proxy: sin esta cabecera, todos los registros y los límites por origen apuntan al mismo lugar.
- El prefijo, cuando el framework lo soporta, para que genere las rutas correctas por sí mismo.
Antes de seguir, predecí
Cómo se depura
La regla que ahorra más tiempo es determinar de qué lado está el problema antes de tocar configuración.
Cuatro pasos, en orden
- Pedirle directo al contenedor, desde el mismo servidor, la misma ruta que falla. Si responde bien, el problema es del proxy.
- Mirar qué ruta recibe la aplicación, en sus propios registros. Ahí se ve si el prefijo se recortó o no.
- Mirar la respuesta cruda, con encabezados, en vez de la página renderizada. Un 301 hacia un destino inesperado se ve ahí y no en el navegador.
- Recién entonces, cambiar una sola cosa. Con dos cambios a la vez no se sabe cuál funcionó.
Más a fondo · nivel seniorEl reload que no aplica lo que estás leyendo
Un detalle que hace perder tardes: si el archivo de configuración está montado dentro del contenedor y se lo reemplaza desde afuera de cierta manera, el proceso puede seguir viendo el contenido anterior aunque el archivo en disco ya esté nuevo. Se recarga, se prueba, no cambia nada, y uno concluye que la configuración está mal cuando en realidad nunca se aplicó. Ante la duda, reiniciar el contenedor en vez de recargar.
La reescritura en el log
Buscá en el log
La aplicación se publicó bajo /panel. La página principal carga y todo lo demás da 404. ¿Qué línea muestra qué está recibiendo la aplicación?
debug 3info 6warn 2error 011 de 11
El proxy recortó el prefijo: pidió /panel/static/app.css y la aplicación recibió /static/app.css. Eso es lo que hace la barra final en el destino, y para la ruta raíz no se nota, porque recortar /panel deja / y ahí hay algo. Se nota en todo lo demás. El arreglo es una decisión de dos: o el proxy no recorta, o la aplicación se configura con un prefijo base y genera sus propias rutas con él. Lo que no funciona es que cada uno suponga algo distinto.
Cómo se decide de una vez
Cierre
Autoevaluación
¿Lo entendiste?
Práctica