Estás navegando por tu sitio web de noticias favorito por tercera vez hoy. Haces clic en actualizar y la página se carga casi al instante. Detrás de escena, tu navegador en realidad no volvió a descargar el logotipo del sitio, la hoja de estilos CSS ni los archivos JavaScript. Ya los tenía. Simplemente consultó con el servidor para ver si habían cambiado, y el servidor dio una respuesta simple de una línea: 304 Not Modified
.
Este pequeño y eficiente código de estado es uno de los héroes anónimos del rendimiento web. Es la razón por la que la web moderna se siente rápida y receptiva. Es la base del almacenamiento en caché, y ahorra miles de millones de gigabytes de ancho de banda cada día. A primera vista, puede que no parezca tan emocionante como una redirección o un código de error, pero créeme, es una de las herramientas más poderosas para hacer que los sitios web y las API sean más rápidos y eficientes.
El 304
no es un error; es una confirmación exitosa y eficiente. Es la forma en que el servidor dice: "Ya tienes la última versión de este archivo guardada localmente. No necesito enviártela de nuevo. Simplemente usa lo que tienes".
En esta publicación de blog, profundizaremos en lo que significa 304 Not Modified, cómo funciona, por qué es importante y cómo los desarrolladores pueden usarlo para construir sitios web y API más rápidos y receptivos. Si eres desarrollador, comprender cómo funciona el 304
es crucial para construir aplicaciones rápidas, eficientes y escalables.
Antes de empezar, si quieres probar y explorar cómo tus servidores web o API manejan respuestas como 304 Not Modified, asegúrate de descargar Apidog gratis. Apidog es una potente herramienta de prueba y documentación de API que te ayuda a explorar respuestas HTTP, validar respuestas y optimizar tu backend como un profesional. Lo mejor de todo es que es gratis de descargar. Empieza a optimizar tus API hoy mismo.
Ahora, profundicemos en el código de estado HTTP 304 Not Modified y veamos por qué es tan importante.
El problema: Transferencia de datos ineficiente
En los primeros días de la web, cada solicitud funcionaba de la misma manera:
- Navegador: "Dame
/logo.png
." - Servidor: "¡Aquí está!" (
200 OK
+ los datos completos de la imagen) - Navegador (2 segundos después): "Dame
/logo.png
de nuevo." - Servidor: "¡Aquí está de nuevo!" (
200 OK
+ los mismos datos exactos de la imagen)
Esto era increíblemente ineficiente. El mismo logotipo, hoja de estilos y scripts se transferían a través de la red docenas de veces al día para un solo usuario, consumiendo ancho de banda y ralentizando la carga de las páginas.
La solución a esta ineficiencia es un proceso de dos partes: almacenamiento en caché y solicitudes condicionales, con el código de estado 304
como la estrella del espectáculo.
¿Qué significa realmente HTTP 304 Not Modified?
El código de estado 304 Not Modified
es una respuesta similar a una redirección que indica que no es necesario que el servidor transfiera el recurso solicitado porque el cliente ya tiene una versión actualizada en su caché local.
Es un mensaje de éxito con un cuerpo vacío. El servidor esencialmente está diciendo: "Tu solicitud fue exitosa. El recurso que pediste no ha cambiado. No tengo nada nuevo que enviarte".
En otras palabras, en lugar de desperdiciar ancho de banda enviando los mismos datos una y otra vez, el servidor simplemente responde con una confirmación ligera.
Una respuesta 304
típica es bellamente minimalista:
HTTP/1.1 304 Not ModifiedCache-Control: public, max-age=300ETag: "a3c8d7e1f5g2"Date: Sat, 28 Oct 2023 10:00:00 GMT
¿Notas lo que falta? El cuerpo de la respuesta. No hay datos de imagen, ni CSS, ni JSON. Esto es lo que hace que el 304
sea tan eficiente. La respuesta completa son solo unos pocos cientos de bytes de encabezados, ahorrando los megabytes de datos que habrían estado en el cuerpo.
¿Por qué existe el 304? (Una breve historia)
En los primeros días de la web, cada vez que cargabas una página web, el navegador obtenía todo (HTML, CSS, imágenes, scripts) desde cero. Esto era lento e ineficiente.
Para resolver esto, HTTP introdujo mecanismos de almacenamiento en caché como Last-Modified
y ETag
. El código de estado 304 fue diseñado para:
- Ahorrar ancho de banda.
- Reducir la carga del servidor.
- Acelerar los tiempos de respuesta.
Se convirtió en un estándar en HTTP/1.1 y sigue siendo una piedra angular del rendimiento web hoy en día.
Por qué es importante el 304 Not Modified
Piénsalo de esta manera: cada vez que un usuario visita un sitio web o solicita un recurso de API, descargar el contenido completo cada vez puede ser lento e ineficiente, especialmente para usuarios móviles o con conexiones lentas. Al aprovechar el 304 Not Modified:
- Reduce la transferencia de datos innecesaria, por lo que los usuarios cargan las páginas más rápido y los proveedores ahorran ancho de banda.
- Disminuye la carga del servidor porque el servidor no tiene que enviar respuestas completas repetidamente.
- Mejora la experiencia del usuario con tiempos de carga más rápidos y una navegación más fluida.
- Admite la escalabilidad al manejar de manera eficiente las solicitudes repetidas.
Sin el 304, el almacenamiento en caché sería ineficaz y los sitios web más lentos.
El baile de dos pasos: Cómo funcionan juntos el almacenamiento en caché y el 304
El 304
no funciona solo. Es parte de un elegante baile entre el cliente y el servidor.
Paso 1: La primera solicitud (La solicitud "semilla")
La primera vez que un navegador solicita un recurso, el servidor responde con dos piezas de información cruciales junto con los datos (200 OK
):
ETag
(Etiqueta de entidad): Un identificador único, como una huella digital, para la versión actual del recurso. A menudo es un hash del contenido del archivo. Si el archivo cambia, el ETag cambia.
ETag: "a3c8d7e1f5g2"
Last-Modified
: La fecha y hora en que el recurso fue modificado por última vez.
Last-Modified: Sat, 28 Oct 2023 09:00:00 GMT
El navegador almacena el recurso y estos dos validadores en su caché.
Paso 2: La solicitud subsiguiente (La solicitud "condicional")
Cuando el navegador necesita el mismo recurso de nuevo (por ejemplo, el usuario visita otra página en el mismo sitio), no lo solicita a ciegas. Realiza una solicitud condicional incluyendo los validadores que guardó.
Puede hacerlo de dos maneras:
Usando el encabezado If-None-Match
(con el ETag):
GET /logo.png HTTP/1.1Host: www.example.comIf-None-Match: "a3c8d7e1f5g2"
Esta solicitud dice: "Por favor, envíame /logo.png
solo si su ETag actual es diferente del que ya tengo (a3c8d7e1f5g2
)."
Usando el encabezado If-Modified-Since
(con la fecha):
GET /logo.png HTTP/1.1Host: www.example.comIf-Modified-Since: Sat, 28 Oct 2023 09:00:00 GMT
Esta solicitud dice: "Por favor, envíame /logo.png
solo si ha sido modificado desde el 28 de octubre."
Paso 3: La decisión del servidor
El servidor recibe esta solicitud condicional y verifica el recurso.
- CASO A: El recurso NO ha cambiado. El servidor ve que el ETag actual aún coincide con
"a3c8d7e1f5g2"
. Responde con un304 Not Modified
y no envía los datos del recurso. - CASO B: El recurso ha cambiado. El servidor ve que el ETag ya no coincide. Responde con un
200 OK
, los datos completos del recurso y nuevos encabezadosETag
yLast-Modified
para que el navegador los almacene en caché.
Este elegante apretón de manos asegura que los datos solo se transfieran cuando sea absolutamente necesario.
El papel de los encabezados HTTP en las respuestas 304
La magia del 304 reside en los encabezados. Dos actores clave son:
- Last-Modified → indica a los clientes cuándo se actualizó por última vez el recurso.
- ETag (Etiqueta de entidad) → un identificador único para la versión del recurso.
Cuando el cliente envía If-Modified-Since
o If-None-Match
, el servidor comprueba:
- Si no ha cambiado → devuelve 304.
- Si ha cambiado → devuelve 200 OK con el nuevo recurso.
¿Qué son ETag y Last-Modified?
- ETag (Etiqueta de entidad): Un identificador único (a menudo un hash) que representa la versión de un recurso.
- Last-Modified: La marca de tiempo que indica cuándo se modificó por última vez el recurso.
Los clientes envían estos valores como encabezados condicionales durante las solicitudes repetidas para verificar si el contenido ha cambiado.
Casos de uso comunes para respuestas 304
- Sitios web con activos estáticos (CSS, JS, imágenes).
- API REST que devuelven grandes resultados JSON.
- Aplicaciones móviles que dependen de la sincronización con el servidor.
- CDN que optimizan la entrega de contenido.
- Optimización del rastreo de motores de búsqueda.
Ejemplo de un flujo de trabajo 304
Aquí tienes un ejemplo simplificado entre un navegador y un servidor:
Solicitud inicial
textGET /styles.css HTTP/1.1 Host: example.com
Respuesta inicial
`textHTTP/1.1 200 OK ETag: "abc123" Last-Modified: Tue, 15 Sep 2025 11:00:00 GMT Content-Type: text/css
/* Estilos CSS aquí */`
Solicitud subsiguiente
textGET /styles.css HTTP/1.1 Host: example.com If-None-Match: "abc123" If-Modified-Since: Tue, 15 Sep 2025 11:00:00 GMT
Respuesta del servidor (sin cambios)
textHTTP/1.1 304 Not Modified
Debido a que el servidor dice que el contenido no ha cambiado, el navegador usa su copia en caché.
¿Por qué no simplemente servir siempre contenido en caché?
¡Una buena pregunta!
Si los clientes siempre usaran contenido en caché sin validación, podrían perderse actualizaciones o cambios esenciales para la corrección. El mecanismo 304 asegura que los clientes obtengan recursos actualizados si es necesario, mientras evita transferencias inútiles si nada cambió.
SEO y 304 Not Modified
Desde una perspectiva de SEO, las respuestas 304 ayudan a los motores de búsqueda a rastrear tu sitio de manera más eficiente. Reducen el uso de ancho de banda y mejoran los presupuestos de rastreo al servir respuestas de "sin contenido" para páginas sin cambios, permitiendo que los motores de búsqueda se centren en contenido nuevo.
¿Por qué es tan importante el 304? Los beneficios
- Tiempos de carga ultrarrápidos: El navegador puede mostrar una página sin esperar a descargar cada activo de nuevo. Puede usar sus versiones en caché inmediatamente después de una rápida verificación
304
. - Ahorro masivo de ancho de banda: Este es el mayor beneficio. Servir una respuesta
304
en lugar de una200
con un cuerpo grande ahorra una enorme cantidad de tráfico de red tanto para el usuario como para el servidor. - Carga reducida del servidor: Los servidores ahorran ciclos de CPU y operaciones de E/S al no tener que leer y enviar el mismo archivo desde el disco miles de veces por segundo.
- Mejor experiencia de usuario: Sitios web más rápidos hacen usuarios más felices.
- Reducción de costos: Para las empresas que pagan por el ancho de banda (como las facturas de alojamiento en la nube), reducir la transferencia de datos ahorra dinero directamente.
Problemas comunes relacionados con 304 Not Modified
- ETag/Last-Modified incorrectos o faltantes: Conduce a que los clientes se pierdan actualizaciones o vuelvan a descargar innecesariamente.
- Archivos estáticos no versionados correctamente: Impide la validación de la caché.
- Proxies o CDN que manejan mal los encabezados condicionales: Puede causar incoherencia de la caché.
- Mala configuración del servidor: Devolver 200 OK cuando 304 es apropiado o viceversa.
Probando solicitudes condicionales con Apidog

Probar el comportamiento de la caché puede ser complicado. Debes enviar solicitudes con encabezados específicos e interpretar la respuesta del servidor. Apidog es la herramienta perfecta para esto.
Con Apidog, puedes:
- Capturar validadores: Envía una primera solicitud a un recurso y usa la interfaz de Apidog para ver y copiar fácilmente los encabezados
ETag
yLast-Modified
de la respuesta200
. - Crear solicitudes condicionales: Crea una nueva solicitud a la misma URL y agrega fácilmente los encabezados
If-None-Match
oIf-Modified-Since
con los valores que capturaste. - Verificar la respuesta 304: Envía la solicitud condicional y confirma que el servidor devuelve un estado
304 Not Modified
sin cuerpo. - Probar la invalidación de la caché: Modifica el recurso en el servidor (si tienes acceso) y repite la solicitud condicional. Ahora deberías ver un
200 OK
con los nuevos datos, lo que demuestra que tu lógica de caché funciona. - Automatizar pruebas: Construye suites de pruebas en Apidog que automaticen este proceso, asegurando que los encabezados de caché de tu API estén siempre configurados correctamente.
Con Apidog, puedes ajustar la caché sin esperar casos extremos del mundo real. Descarga Apidog gratis para aprovechar estas capacidades.
Mejores prácticas para desarrolladores
Si estás construyendo una aplicación del lado del servidor, puedes aprovechar el 304
:
- Siempre envía validadores: Para recursos almacenables en caché (imágenes, CSS, JS, datos de API estáticos), siempre incluye un encabezado
ETag
oLast-Modified
en tus respuestas200
. - Implementa lógica condicional: En el código de tu servidor, verifica los encabezados
If-None-Match
yIf-Modified-Since
. Si coinciden con el recurso actual, responde con304
. Si no, responde con200
y los nuevos datos. - Usa
Cache-Control
: El encabezadoCache-Control
(por ejemplo,max-age=3600
) le dice al navegador cuánto tiempo puede considerar un recurso fresco sin siquiera tener que hacer una solicitud condicional. Esto es aún más eficiente que un304
.
304 Not Modified y las API RESTful
En las API REST, el 304 mejora enormemente la eficiencia al permitir que los clientes almacenen en caché las representaciones de los recursos. Un manejo adecuado de la caché reduce la carga del servidor y acelera la sincronización del cliente.
En las API que sirven recursos actualizados con frecuencia, las solicitudes condicionales con respuestas 304 son esenciales para un rendimiento escalable.
304 Not Modified en navegadores web
Los navegadores modernos dependen en gran medida del 304:
- Chrome, Firefox, Safari implementan el almacenamiento en caché basado en
ETag
yLast-Modified
. - Una actualización (F5) aún puede activar comprobaciones 304.
- Una actualización forzada (Ctrl + Shift + R) omite la caché, forzando un 200.
304 vs 200: ¿Cuál es la diferencia?
Ambos códigos significan "éxito", pero la diferencia está en la carga útil:
- 200 OK → Se devuelve el recurso completo.
- 304 Not Modified → No se devuelve ningún recurso, se usa la caché.
Piensa en el 304 como si dijera:
"No te preocupes, no hay nada nuevo. Sigue usando lo que ya tienes."
304 vs 200 OK: Cuándo elegir qué
- Siempre sirve 200 OK con contenido completo en las primeras solicitudes o cuando el contenido ha cambiado.
- Sirve 304 Not Modified solo cuando el contenido no ha cambiado.
Un control de caché adecuado asegura que los clientes sepan cuándo solicitar actualizaciones y cuándo usar datos en caché.
Conclusión: El caballo de batalla silencioso de la web
El código de estado HTTP 304 Not Modified
es una obra maestra de diseño eficiente. Es un caballo de batalla silencioso, detrás de escena, que hace que la web moderna sea escalable y rápida. Demuestra el poder de un protocolo cooperativo donde clientes y servidores trabajan juntos para evitar trabajo innecesario.
El código de estado 304 Not Modified puede que no acapare titulares como el 404 o el 500, pero es esencial para el rendimiento, el almacenamiento en caché y la eficiencia. Reduce el uso de ancho de banda, acelera la carga de páginas y mantiene las API funcionando sin problemas.
Aunque los usuarios nunca lo verán, experimentan sus beneficios todos los días a través de páginas de carga más rápida y una navegación más fluida. Para los desarrolladores, comprender e implementar correctamente el soporte para las respuestas 304
es una habilidad clave en la optimización de cualquier propiedad web.
Así que la próxima vez que una página se cargue en un abrir y cerrar de ojos, recuerda la pequeña respuesta 304
que lo hizo posible. Si eres desarrollador, dominar el 304 significa construir aplicaciones más rápidas e inteligentes. Comprender cómo implementar y probar las respuestas 304 amplifica tu capacidad para construir aplicaciones web y API eficientes y de alto rendimiento.
Y recuerda, probar el comportamiento de la caché y la redirección es más fácil que nunca con Apidog, una herramienta gratuita y potente diseñada para ayudarte a dominar los códigos de estado HTTP como el 304 Not Modified. No te fíes solo de tus suposiciones, simula y valida el almacenamiento en caché con Apidog.