¿Por qué se está almacenando en caché esta respuesta?

32

Tengo un cliente cuyo sitio index.html actualmente regresa con estos encabezados:

Aceptar-Rangos: bytes
Conexión: Keep-Alive
Codificación de contenido: gzip
Longitud del contenido: 3658
Tipo de contenido: texto / html
Fecha: jue, 10 oct 2013 07:36:27 GMT
ETag: "4aa95e1-2ed2-4e721324728b7"
Keep-Alive: tiempo de espera = 5, max = 100
Última modificación: martes, 24 de septiembre de 2013 13:34:30 GMT
Servidor: Apache / 2.2.22
Variar: aceptar-codificación, agente de usuario

Obviamente voy a recomendar que se agregan Expireso Cache-Controlen su caso, pero estoy confundido: Chrome almacena en caché este recurso y lo utiliza de la memoria caché (no enviar una solicitud en absoluto ), incluso después de varias horas (por ejemplo, se reutiliza una copia se almacenó en caché ayer a la 1:30 pm esta mañana a las 8:30 am). Puedo ver esto con bastante claridad en la pestaña Red de la consola Chrome, donde muestra la solicitud y aparece 200 (OK)en gris en la columna Estado y (from cache)en la columna Tamaño . (No he cambiado los valores predeterminados de almacenamiento en caché de Chrome).

Me doy cuenta de que la especificación permite a los agentes de usuario tomar su propia decisión en ausencia de la dirección de los encabezados. ¿Eso es lo que está pasando aquí? ¿Chrome ve que se modificó por última vez hace varios días y se siente libre de usar una versión que está (por ejemplo) desactualizada? ¿O hay algo que me falta?

TJ Crowder
fuente

Respuestas:

33

Cuando "Expira" y "encabezados Cache-Control" no se especifican, pero una "última modificación" de cabecera se especifica, los navegadores tienen que adivinar cuánto tiempo deben mantener el documento en la memoria caché. Algunos navegadores hacen utilizan algoritmos que permiten a la página permanecen en la memoria caché para un día o más.

La guía de mejores prácticas de almacenamiento en caché de Google dice:

Last-Modified es un encabezado de almacenamiento en caché "débil" en el sentido de que el navegador aplica una heurística para determinar si se obtiene el elemento del caché o no. (Las heurísticas son diferentes entre los diferentes navegadores).


Mozilla (Firefox) tiene una pregunta frecuente sobre el almacenamiento en caché de HTTP que describe su algoritmo para esta situación (aunque es posible que el algoritmo haya cambiado desde que el documento está fechado en 2002):

... buscamos un encabezado "Última modificación". Si este encabezado está presente, la vida útil de la memoria caché es igual al valor del encabezado "Fecha" menos el valor del encabezado "Última modificación" dividido por 10.

Entonces, en su caso donde la diferencia entre modificado y ahora es de 15 días, Firefox guardaría en caché el recurso durante 1,5 días.

Parece que todos los principales navegadores usan la misma regla del 10% que implementa Firefox. Se ha hecho una pregunta en StackOveflow sobre estas heurísticas . Diferentes respuestas allí para diferentes navegadores muestran que todos tienen implementaciones similares. Hay respuestas para Internet Explorer y Webkit (Chrome y Safari).


El tamaño de la memoria caché del navegador probablemente será el factor limitante para un archivo que el algoritmo de almacenamiento en caché determine que puede mantenerse durante más de un día. Los navegadores generalmente tienen una configuración para la cantidad de espacio en disco que usan para la memoria caché. Muchos usuarios también borran su caché cuando cierran su navegador. Por lo tanto, la cantidad de tiempo durante la cual se almacena en caché dicho archivo generalmente depende de:

  • La cantidad de espacio de caché que el navegador ha asignado
  • El número de sitios web que visita un usuario (y el tamaño de esos sitios)
  • Si el usuario ha cerrado o no su navegador
Stephen Ostermiller
fuente
¿Puede aclarar "entonces Firefox guardaría en caché el recurso durante 1,5 días". A partir de esa fecha, se almacenará en caché hasta 1,5 días Si ya son 15 días, entonces ya habría expirado, ¿no? Y como AHORA menos la última modificación aumentará para siempre, es decir, ¡se almacenará en caché para siempre!
myDoggyWritesCode
1
No para siempre Por 1/10 del tiempo entre el último encabezado modificado y el tiempo de descarga. Si han pasado 15 días para usted, eso podría significar que han pasado 150 días desde la última modificación del archivo.
Stephen Ostermiller