2012-04-06 12 views
5

Quiero que los navegadores siempre agreguen (excepto la primera vez) encabezado de solicitud "If-Modified-Since" para evitar el tráfico innecesario.Chrome no envía "If-Modified-Since"

cabeceras de respuesta son:

Accept-Ranges:bytes 
Cache-Control:max-age=0, must-revalidate 
Connection:Keep-Alive 
Content-Length:2683 
Content-Type:text/html; charset=UTF-8 
Date:Thu, 05 Apr 2012 13:06:19 GMT 
Keep-Alive:timeout=15, max=497 
Last-Modified:Thu, 05 Apr 2012 13:05:11 GMT 
Server:Apache/2.2.21 (Red Hat) 

FF 11 y el IE 9 tanto enviar "If-Modified-Since" y conseguir 304 en respuesta, pero Chrome 18 no y obtener 200.

¿Por qué? ¿Cómo forzar a Chrome a enviar el encabezado "If-Modified-Since"? No sé si es importante o no, pero todas las solicitudes pasan por HTTPS.

+0

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. –

+3

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

+0

¿Alguna razón en particular para enviar Keep-Alive? –

Respuesta

20

que he estado persiguiendo este problema desde hace algún tiempo, pensé en compartir lo que he encontrado.

"La regla es en realidad bastante simple: cualquier error con el certificado significa que la página no se almacenará en caché".

https://code.google.com/p/chromium/issues/detail?id=110649

Si está utilizando un certificado autofirmado, aunque se diga Chrome para agregar una excepción de tal manera que se almacenan en caché se carga la página, no hay recursos de esa página, y las solicitudes posteriores no se tener un encabezado If-Modified-Since.

+0

Whew, me salvó un montón de tiempo, ¡gracias! –

+0

Santa mierda. Me tomó por siempre tropezar con esto, pero era exactamente el problema al que me estaba dirigiendo. ¡Gracias una tonelada! – Snekse

+0

Gracias @Neek. Me salvaste el tiempo y me salvaste de la frustración: D –

4

he notado casi el mismo comportamiento y mis conclusiones son:

  • En primer lugar el indicador de estado 200 en cromo no es toda la verdad, que hay que buscar en el "Contenido Tamaño" columna también. Si esto dice "(de la memoria caché)", el recurso se tomó directamente de la memoria caché sin siquiera preguntar si se modificó.

  • Este comportamiento de almacenamiento en caché de los recursos que carecen de cualquier indicación de caducidad o máxima edad parece aplicarse cuando se solicitan archivos estáticos que tienen un encabezado de última modificación. He notado que Chrome (ver 22):

    1. Pregunta por el archivo la primera vez (obviamente, ya que no está en el caché).
    2. Pregunta si se modifica por segunda vez (ya que está en caché pero no tiene ninguna indicación de frescura).
    3. Lo usa directamente la tercera vez y luego (incluso si se trata de una nueva sesión del navegador).
  • estoy un poco desconcertado por este comportamiento, pero es bastante razonable, si es estática, se modificó hace mucho tiempo, y no ha cambiado desde la última vez que compruebe podría suponer que se va a ser válido por un tiempo más (no sé cómo lo calculan).

+0

Hola @Albert Bertilsson 1. pregunta por el archivo la primera vez ** 2. ** 3. **, ¿es esta tu conclusión?No creo que sea correcto, qué política usaría el caché de Chrome debería ser Factor LM, no lo que dijiste. Si refieres esto desde el documento oficial de google, pasa el enlace, mucho. – materliu

+0

Con respecto a su último punto, ¿cómo sabría el navegador si un archivo es estático? –

3

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:

  1. Se debe estar en hora media de Greenwich (GMT), y
  2. 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_RFC1123no 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!

2

tuve el mismo problema, en Chrome todas las peticiones fueron siempre código de estado 200, en otros navegadores 304.

Resultó que tenía la caché desactivar (mientras DevTools está abierto) registramos en Devtools - Configuración - Página general ... :)

+0

exactamente lo que estaba enfrentando ... gracias amigo –

0
  1. No deshabilite la memoria caché en las Herramientas de desarrollo de Chrome (en la pestaña "Red").
  2. Cache-Control debería ser Cache-Control: public. Utilice true como segundo parámetro al header función de PHP: header("Cache-Control: public", true);
Cuestiones relacionadas