Calculadora de caducidad de caché HTTP
Escribe los valores de Cache-Control, Expires, Date y Age de una respuesta, la hora a la que se recibió y la hora de comprobación. La calculadora da el tiempo de frescura, la edad actual y si la respuesta sigue fresca.
Qué hace esta calculadora
Cubre una parte de RFC 9111, la norma de almacenamiento en caché de HTTP: el cálculo de la frescura. Es la parte que decide si una respuesta almacenada se puede reutilizar sin comprobarla con el servidor de origen. No se tratan la validación (ETag, If-Modified-Since, 304), Vary ni Cache-Control de la petición.
La frescura no es una actualización ni un borrado
Que una respuesta esté caducada solo significa que una caché no puede reutilizarla sin comprobarla antes. No significa que la pantalla del navegador se actualice sola, y no significa que el archivo del servidor de origen se cambie o se borre. Asimismo, que una respuesta esté fresca no significa que el archivo del servidor no haya cambiado. De la cabecera Expires, la norma dice que «no implica que el recurso original vaya a cambiar o a dejar de existir en ese momento, antes o después». Esta calculadora solo resuelve la aritmética del tiempo de la copia en caché.
Tiempo de frescura y edad actual
- Tiempo de frescura: la cantidad de tiempo que la respuesta puede seguir «fresca». Lo fija la propia respuesta (Cache-Control o Expires) y no cambia con el paso del tiempo.
- Edad actual: el tiempo que ha pasado desde que se generó la respuesta. Crece con el paso del tiempo.
- ¿Está fresca? La respuesta está fresca solo cuando el tiempo de frescura es mayor que la edad actual (cuando son iguales, está caducada).
- Frescura restante = tiempo de frescura − edad actual.
Qué valor fija el tiempo de frescura
Según la sección 4.2.1 de RFC 9111, se usa la primera coincidencia:
| Orden | Caché compartida (CDN, proxy) | Caché privada (navegador) |
|---|---|---|
| 1 | s-maxage | (no se usa s-maxage) |
| 2 | max-age | max-age |
| 3 | Expires − Date | Expires − Date |
| 4 | Si no hay ninguno, no hay caducidad explícita | Igual |
- Si hay max-age, se ignora Expires. En una caché compartida, si hay s-maxage, se ignoran max-age y Expires (sección 5.3).
- Si la misma directiva aparece más de una vez, se usa la primera (uno de los enfoques que permite la norma).
- Un max-age o s-maxage que no es un número entero, o va entre comillas (la norma dice que un emisor no debe generar la forma entrecomillada), se trata como no válido, y la respuesta se considera caducada (tiempo de frescura 0). Un valor superior a 2 147 483 648 se trata como 2 147 483 648 (sección 1.2.2).
- Si Expires es
0o una fecha que no existe, la respuesta se trata como ya caducada (sección 5.3). - Cuando no hay caducidad explícita, no se calcula la frescura heurística (por ejemplo, una estimación a partir de Last-Modified). La norma deja el tiempo heurístico a la implementación.
Cómo se calcula la edad actual
Las fórmulas proceden de la sección 4.2.3 de RFC 9111:
- Edad aparente = max(0, hora de recepción − Date)
- Edad al recibirla = max(edad aparente, cabecera Age + retardo de la respuesta)
- Edad actual = edad al recibirla + tiempo desde que se recibió
Esta calculadora no pide la hora a la que se envió la petición, así que toma el retardo de la respuesta (el tiempo desde que se envía la petición hasta que se recibe la respuesta) como 0. En una conexión con un retardo grande, la edad calculada puede ser menor que la real. La norma también permite usar solo la cabecera Age más el retardo.
Reglas para la entrada
- Escribe las fechas como una IMF-fixdate (por ejemplo
Sun, 06 Nov 1994 08:49:37 GMT) o como una hora UTC del tipo2026-10-21 07:28:00. Todo está en UTC (GMT); no se tratan las zonas horarias. El año debe ir de 1900 a 2100, y los segundos de 0 a 59 (no se acepta un segundo intercalar, 60). El nombre del día no se comprueba con la fecha. - Los formatos RFC 850 y asctime son formatos que se espera que acepten los receptores de HTTP, pero esta calculadora no los admite. (Eso no significa que no sean válidos en HTTP. Convierte el valor a una IMF-fixdate.)
- Si Date está vacío, la hora que escribes como «Hora a la que se recibió la respuesta» se usa en lugar de Date. RFC 9110 dice que un receptor que recibe una respuesta sin Date anota la hora de recepción y la añade como Date. Si esa hora también está vacía, no se pueden hacer los cálculos que necesitan Date (Expires − Date y la edad aparente). La hora actual del navegador no se usa nunca automáticamente; solo se rellena cuando pulsas el botón «hora actual», en el campo «Hora de comprobación».
- La hora de comprobación no debe ser anterior a la hora de recepción de la respuesta.
Otras directivas de Cache-Control
No se usan en el cálculo, pero se muestran como notas sobre la reutilización.
- no-store: no debe almacenarse. private: una caché compartida no debe almacenarla (un navegador sí).
- no-cache (sin argumentos): incluso mientras está fresca, no se puede reutilizar sin validación.
- must-revalidate: una vez caducada, no debe usarse sin validación. proxy-revalidate: igual, pero no se aplica a una caché privada.
- public: permite explícitamente el almacenamiento.
- immutable (RFC 8246) y stale-while-revalidate y stale-if-error (RFC 5861) quedan fuera de RFC 9111. Se reconocen pero no se usan en el cálculo.
Ejemplos
| Dato | Resultado |
|---|---|
| max-age=3600, sin Age, 1800 s después de recibirla | Tiempo de frescura 3600 s, edad actual 1800 s, quedan 1800 s (fresca) |
| Igual, a exactamente 3600 s | Edad actual 3600 s. Es igual al tiempo de frescura, así que está caducada |
| max-age=3600, Age=600, recién recibida | Edad actual 600 s, quedan 3000 s |
| Caché compartida con s-maxage=60, max-age=3600 | Tiempo de frescura 60 s (se ignora max-age) |
Cosas que conviene saber
- Es un cálculo basado en la norma. Los navegadores y las CDN reales no siempre se comportan exactamente como describe la norma. Acciones como una recarga forzada y los ajustes propios de una CDN pueden dar resultados distintos. No se garantiza el comportamiento de un producto concreto.
- No se tratan la frescura heurística, la validación, Vary, las directivas de la petición ni la suma de varias cachés.
Fuentes y comprobaciones
Lo siguiente se comprobó con el texto completo de las normas el 1 de noviembre de 2026:
- RFC 9111, «HTTP Caching»: https://www.rfc-editor.org/rfc/rfc9111 (secciones 1.2.2, 4.2.1, 4.2.3, 5.1, 5.2.2 y 5.3, incluida la prueba de frescura
freshness_lifetime > current_age) - RFC 9110, «HTTP Semantics»: https://www.rfc-editor.org/rfc/rfc9110 (secciones 5.6.7 y 6.6.1)
Esta calculadora sigue esas secciones solo para la frescura. Superar este cálculo no equivale a afirmar que un producto o un servidor cumple la norma.
Preguntas frecuentes
¿Qué pasa cuando están presentes max-age y Expires?
max-age tiene prioridad y se ignora Expires (RFC 9111, sección 5.3).
¿Se aplica s-maxage a un navegador?
s-maxage es una directiva para cachés compartidas. Una caché privada (un navegador) no la usa.
¿Qué es la cabecera Age?
Es el número de segundos, escrito por una caché intermedia, desde que se generó la respuesta o se comprobó por última vez en el origen. Esta calculadora la usa para hallar la edad actual.
¿Una respuesta caducada desaparece o se actualiza sola?
No. Caducada solo significa que una caché debe comprobarla antes de reutilizarla. No actualiza la pantalla ni cambia nada en el servidor de origen.
¿Cómo puedo comprobar una hora?
Pueden ayudarte el conversor de marcas de tiempo Unix y la calculadora de expresiones cron.