Acabo de encontrar esta pregunta, y después de enmendar el comportamiento de If_Modified_Since
de Chrome, he encontrado la respuesta.
La decisión de Chrome de almacenar en caché los archivos se basa en el encabezado Expires
que recibe.La cabecera Expires
tiene dos requisitos principales:
- Se debe estar en hora media de Greenwich (GMT), y
- Se debe ser formateada de acuerdo con RFC 1123 (que es básicamente RFC 822 con una de cuatro dígitos año).
El formato es el siguiente:
Expires: Sat, 07 Sep 2013 05:21:03 GMT
Por ejemplo, en PHP, las siguientes salidas de un encabezado con el formato adecuado.
$duration = time() + 3600 // Expires in one hour.
header("Expires: " . gmdate("D, d M Y H:i:s", $duration) . " GMT");
("GMT" se adjunta a la cadena en lugar de la "e" bandera de zona horaria, ya que, cuando se utiliza con gmdate()
, la bandera es la salida "UTC", que RFC 1123 considera no válida. También tenga en cuenta que el PHP constantsDateTime::RFC1123
y DATE_RFC1123
no se proporcionar el formato correcto, ya que la diferencia de salida a GMT en horas [es decir, 02: 00]. en lugar de "GMT")
Ver el W3C's date/time format specifications para obtener más información.
En resumen, Chrome solo reconocerá el encabezado si sigue este formato exacto. Esto, combinado con la cabecera Cache-Control
...
header("Cache-Control: private, must-revalidate, max-age=" . $duration);
... me permitió implementar el control de caché adecuado. Una vez que Chrome reconoció esos encabezados, comenzó a almacenar en caché las páginas que le envié (¡incluso con cadenas de consulta!), Y también comenzó a enviar el encabezado If_Modified_Since
. Lo comparé con una fecha almacenada de "última modificación", devuelta HTTP/1.1 304 Not Modified
, y todo funcionó perfectamente.
¡Espero que esto ayude a cualquier persona que tropiece!
Al final del día, le toca a los navegadores, y cualquier caché intermedio, ya sea que * se * contenido realidad caché (se puede controlar si se * deben *). No podrá evitar al 100% que los agentes de usuario vuelvan a solicitar el contenido. –
Me he dado cuenta de que Chrome no envía el encabezado If-Modified-Since a menos que la respuesta sea gzip'd. No estoy seguro de si ese es un patrón real o simplemente mi experiencia tratando de lidiar con la actualización de archivos JS. – Ryan
¿Alguna razón en particular para enviar Keep-Alive? –