since modified last htaccess headers control cache cabecera http caching google-chrome if-modified-since

http - last - Chrome: ¿por qué está enviando solicitudes if-modified-since?



http cache (7)

Tengo una página con muchas imágenes pequeñas (iconos). Cuando se usa con Chrome, cada vez que se recarga la página, Chrome solicita cada ícono del servidor con el encabezado if-modified-since.

Todos los iconos se muestran con encabezados de caducidad máxima y caducidad. Firefox carga imágenes desde su caché.

¿Por qué Chrome hace eso y cómo puedo evitarlo?

Gracias



Con Chrome importa si estás actualizando una página o simplemente visitándola.

Cuando actualices, Chrome hará un ping al servidor para cada archivo, independientemente de si ya están almacenados en caché. Si el archivo no se ha modificado, debería ver una respuesta 304 No modificado . Si el archivo ha sido modificado, verá una respuesta 200 OK en su lugar.

Cuando no se actualice, los archivos almacenados en caché tendrán un estado de 200 OK , pero si observa la columna de tamaño / contenido del panel de red verá (desde la memoria caché) .



Parece que se trata de evitar un caché desactualizado preguntando al servidor si las imágenes han cambiado desde la última vez que las solicitó. Suena como algo bueno, no algo que te gustaría prevenir.


Suponiendo que está ejecutando Apache, puede intentar configurar explícitamente la duración de la caché para ciertos tipos de archivos y / o ubicaciones en el sistema de archivos.

<FilesMatch ".(jpg|jpeg|png|gif)$">
Header set Cache-Control "max-age=604800, public" # 7 days
</FilesMatch>

o algo como

ExpiresByType image/jpeg "access plus 7 days"
ExpiresByType image/gif "access plus 7 days"
ExpiresByType image/png "access plus 7 days"

Por lo general, agruparé los tipos de archivos por uso en un solo directorio y estableceré tiempos de vida en consecuencia.

Los navegadores no deben solicitar archivos en absoluto hasta que estas edades hayan caducado, pero es posible que no siempre lo respeten. Es posible que desee / necesite utilizar las cabeceras de Última modificación y ETag. Hay mucha información buena en la web sobre esto.


Un experimento rápido con el inspector de Chrome muestra que esto solo ocurre cuando la página se vuelve a cargar, no cuando se carga normalmente. Chrome solo está tratando de actualizar su caché. Piénselo: si configura Expires y Max-Age en varias décadas, ¿está pidiendo al navegador que almacene en caché ese recurso y nunca verifique si se actualiza? Está almacenando en caché el recurso cuando puede, pero cuando la página necesita actualizarse, quiere asegurarse de que se actualiza toda la página. Otros navegadores seguramente lo hagan también (aunque algunos tienen la opción de esperar un número de horas antes de actualizar).

Gracias a los navegadores y servidores modernos, actualizar una gran cantidad de íconos no será tan lento como cree: las solicitudes se canalizan para eliminar varios retrasos de ida y vuelta, y todo el propósito del encabezado If-Modified-Since es permitir que servidor para comparar las marcas de tiempo y devolver un código de estado "No modificado". Esto sucederá para cada recurso que la página necesite, pero el navegador podrá realizar todas las solicitudes a la vez y verificar que ninguno de ellos haya cambiado.

Dicho esto, hay algunas cosas que puedes hacer para que esto sea más fácil:

  1. En el inspector de Chrome, usa la pestaña de recursos para ver cómo se están cargando. Si no hay encabezados de solicitud, el recurso se cargó directamente desde el caché. Si ve 304 Not Modified , el recurso se actualizó pero no fue necesario volver a descargarlo. Si ves 200 OK , fue descargado de nuevo.

  2. En el inspector de Chrome, use la pestaña de auditorías para ver qué piensa acerca de la capacidad de almacenamiento de sus recursos, en caso de que algunos de los encabezados de caché no sean óptimos.

  3. Todas esas solicitudes If-Modified-Since y 304 respuestas pueden sumarse, aunque solo consisten en encabezados. Combina tus imágenes en sprites para reducir el número de solicitudes.


Google Chrome ignorará el encabezado Expires si no es una fecha válida por el RFC. Por ejemplo, siempre requiere que los días se especifiquen como dígitos dobles. El 1 de mayo debe configurarse como "01 de mayo" (no "1 de mayo") y así sucesivamente. Firefox los acepta, esto confunde al usuario que el problema se encuentra en el navegador (en este caso, Chrome) y no en los valores de encabezado.

Por lo tanto, si está configurando la fecha de caducidad manualmente (sin usar mod_expires o algo similar para calcular la fecha real), le recomiendo que verifique los encabezados de sus archivos estáticos usando REDbot .