
Una respuesta 304 es el servidor diciendole al navegador: el contenido no ha cambiado desde la última vez que lo revisaste, usa tu copia en caché. Eso suele ser una característica, no un error. Pero cuando hace que los usuarios vean contenido desactualizado, se convierte en un problema que necesitas solucionar.
¿Qué es el código de estado 304?
HTTP 304 Not Modified es un código de respuesta de tipo redirección que le indica al cliente que su versión en caché de un recurso sigue siendo válida. El servidor no envía contenido en el cuerpo de una respuesta 304, solo cabeceras, lo que se traduce en cargas de página más rápidas y un menor uso de ancho de banda.
304 Not Modified: Cómo funciona
La secuencia va así: un navegador solicita un recurso y el servidor responde con el contenido más los encabezados de caché. En la siguiente visita, el navegador envía una solicitud condicional (If-Modified-Since o If-None-Match) preguntando si el contenido ha cambiado. Si nada ha cambiado, el servidor responde 304 y el navegador utiliza su caché local. No se transfieren datos.
304 vs 200: ¿Cuál es la diferencia?
Una respuesta 200 envía el recurso completo. Una respuesta 304 no envía nada excepto encabezados que confirman que la versión en caché sigue siendo actual. Desde la perspectiva del usuario, ambas hacen que la página cargue. La diferencia es la velocidad y el ancho de banda. Una respuesta 304 para una imagen de 500KB ahorra 500KB de transferencia.
¿Es 304 un error? Cuándo se convierte en un problema
304 no es un error. Está funcionando como se diseñó. Se convierte en un problema cuando has actualizado contenido en tu servidor, pero los usuarios siguen viendo la versión antigua porque sus navegadores están mostrando copias en caché que todavía no han expirado. Esa es la parte en la que necesitas intervenir.
Cómo HTTP Caching activa una respuesta 304
Dos mecanismos controlan si un servidor devuelve 304 o 200 en solicitudes repetidas.
El encabezado ETag
Los ETags son identificadores únicos generados por el servidor para cada versión de un recurso. El servidor envía el ETag: «abc123» con la respuesta inicial. En solicitudes posteriores, el navegador envía If-None-Match: «abc123». Si el ETag actual del servidor coincide, él responde con 304. Si no, envía un 200 con el nuevo contenido y un nuevo ETag.
El encabezado Last-Modified
El encabezado Last-Modified le dice al navegador cuándo se cambió por última vez un recurso. En solicitudes posteriores, el navegador envía If-Modified-Since con esa fecha. Si el recurso no ha sido modificado desde entonces, el servidor responde 304.
Cache-Control y su papel
Las cabeceras Cache-Control definen cuánto tiempo deben almacenarse en caché los recursos antes de que el navegador haga siquiera una solicitud condicional. Cache-Control: max-age=3600 significa que el navegador no volverá a solicitar el recurso durante 3600 segundos. Solo después de que ese tiempo expire, el navegador envía la solicitud If-Modified-Since o If-None-Match que puede desencadenar una respuesta 304.
Cómo solucionar el código de estado 304
Cuando las respuestas 304 están causando problemas de contenido desactualizado, aquí tienes cinco enfoques para solucionarlo.
1. Borra la caché de tu navegador
La solución inmediata para un solo usuario que ve contenido desactualizado: borrar la caché del navegador. En Chrome, abre Configuración, ve a Privacidad y seguridad, haz clic en Borrar datos de navegación, selecciona Imágenes y archivos en caché y pulsa Borrar datos. En Firefox, abre Opciones, ve a Privacidad y seguridad y luego pulsa Borrar datos en la sección Cookies y datos del sitio.
Esto obliga al navegador a solicitar contenido nuevo en la próxima visita, eludiendo cualquier ciclo de 304 en caché.
2. Desactivar la caché del navegador para depuración
Durante el desarrollo, utiliza las herramientas de desarrollador del navegador para desactivar la caché. En Chrome DevTools, abre la pestaña de Red y marca Desactivar caché. Esto hace que cada solicitud obtenga una nueva respuesta 200 y facilita verificar que las actualizaciones de contenido estén llegando al navegador.
3. Actualiza los encabezados Cache-Control del lado del servidor
Para obligar a los navegadores a volver a validar el contenido en caché con mayor frecuencia, reduce el valor de max-age. En nginx:
location ~* \.(css|js)$ { add_header Cache-Control "public, max-age=300"; }Establecer el max-age en un valor más corto significa que los navegadores buscarán actualizaciones con más frecuencia.
4. Fuerza una nueva respuesta sin caché
La directiva no-cache no previene la caché. Obliga al navegador a revalidar con el servidor en cada solicitud:
add_header Cache-Control "no-cache";Esto significa que cada carga de página activa una solicitud condicional. Si el contenido no ha cambiado, el servidor aún devuelve 304. Si ha cambiado, devuelve 200 con contenido nuevo. Los usuarios siempre ven contenido actual sin descargar recursos inalterados repetidamente.
5. Comprueba las capas de caché de Proxy y CDN
Si estás detrás de una CDN o un proxy inverso, las respuestas 304 podrían originarse allí en lugar de provenir de tu servidor de origen. Revisa la configuración de tu CDN para comprobar los ajustes de TTL de caché y busca cabeceras como X-Cache: HIT en las respuestas. Una CDN que sirve contenido desactualizado necesita que se purgue su caché, no solo que se borre la caché del navegador.
Código de estado 304 y SEO
Las respuestas 304 son generalmente neutrales para SEO. Los rastreadores de los motores de búsqueda respetan el almacenamiento en caché HTTP, y una respuesta 304 le indica a Googlebot que el contenido de la página no ha cambiado desde el último rastreo. El rastreador usa su versión en caché, lo que es eficiente. Los problemas solo surgen si tu servidor devuelve un 304 cuando el contenido realmente ha cambiado, lo que hace que los rastreadores no detecten tus actualizaciones. Mantén precisos tus ETags y encabezados Last-Modified.
FAQ: Código de estado HTTP 304
El servidor está confirmando que el recurso almacenado en la caché del navegador sigue estando actualizado. No se envía contenido. El navegador carga la página desde su caché local. Es una función de rendimiento, no un error.
No. Los rastreadores de los motores de búsqueda gestionan correctamente las respuestas 304 y utilizan su versión en caché de la página. Solo se convierte en un problema si tu sistema de caché está mal configurado y los rastreadores reciben respuestas 304 desactualizadas cuando el contenido realmente ha cambiado.
Configura Cache-Control: no-store en los recursos afectados para evitar el almacenamiento en caché por completo, o utiliza Cache-Control: no-cache para forzar una revalidación en cada solicitud. Para desarrollo, desactiva la caché en las herramientas de desarrollador del navegador.
Son completamente diferentes. 302 es un redireccionamiento: el navegador lo sigue a una nueva URL. 304 es una respuesta de validación de caché: el navegador utiliza su copia en caché local de la URL actual. Sucedan en diferentes escenarios y tienen diferentes propósitos.