Pourquoi cette réponse est-elle mise en cache?

32

J'ai un client dont le site index.html revient avec ces en-têtes:

Accept-Ranges: octets
Connexion: Keep-Alive
Content-Encoding: gzip
Longueur du contenu: 3658
Type de contenu: text / html
Date: jeu., 10 octobre 2013 à 07:36:27 GMT
ETag: "4aa95e1-2ed2-4e721324728b7"
Keep-Alive: délai d'attente = 5, max = 100
Dernière mise à jour: mar., 24 septembre 2013 13:34:30 GMT
Serveur: Apache / 2.2.22
Vary: Accept-Encoding, User-Agent

Je vais évidemment recommander l'ajout Expiresou Cache-Controlle cas échéant, mais je suis confus: Chrome met cette ressource en cache et l'utilise depuis le cache (sans envoyer de demande du tout ), même après plusieurs heures (par exemple, elle a réutilisé une copie il était caché hier à 13h30 ce matin à 8h30). Je peux le voir très clairement dans l'onglet Réseau de la console Chrome, où il affiche la demande et apparaît 200 (OK)en gris dans la colonne État et (from cache)dans la colonne Taille . (Je n'ai pas modifié les paramètres de mise en cache de Chrome.)

Je me rends compte que la spécification permet aux agents utilisateurs de prendre leur propre décision en l’absence de directives à partir des en-têtes. Est-ce ce qui se passe ici? Chrome constate qu'il a été modifié pour la dernière fois il y a plusieurs jours et se sent libre d'utiliser une version qui est (disons) jusqu'à un jour obsolète? Ou y a-t-il quelque chose qui me manque?

TJ Crowder
la source

Réponses:

33

Lorsque les en-têtes "Expires" et "Cache-Control" ne sont pas spécifiés mais qu'un en-tête "Last-Modified" est spécifié, les navigateurs doivent deviner combien de temps ils doivent conserver le document en cache. Certains navigateurs font utilise des algorithmes qui permettent la page restent dans le cache pour une journée ou plus.

Le guide des meilleures pratiques de mise en cache de Google indique:

Last-Modified est un en-tête de mise en cache "faible" dans la mesure où le navigateur applique une méthode heuristique pour déterminer s'il faut extraire l'élément du cache ou non. (Les heuristiques sont différentes selon les navigateurs.)


Mozilla (Firefox) a une FAQ de mise en cache HTTP qui décrit leur algorithme pour cette situation (bien qu'il soit possible que l'algorithme ait changé depuis la date de publication du document 2002):

... nous cherchons un en-tête "Last-Modified". Si cet en-tête est présent, la durée de vie de la fraîcheur du cache est égale à la valeur de l'en-tête "Date" moins la valeur de l'en-tête "Dernière modification" divisée par 10.

Donc, dans votre cas où la différence entre maintenant et modifié est de 15 jours, alors Firefox mettrait la ressource en cache pendant 1,5 jour.

Il semble que tous les principaux navigateurs utilisent la même règle de 10% que celle implémentée par Firefox. Une question a été posée sur StackOveflow demandant ces heuristiques . Les différentes réponses fournies par les différents navigateurs montrent qu'elles ont toutes une implémentation similaire. Il existe des réponses pour Internet Explorer et Webkit (Chrome et Safari).


La taille du cache du navigateur sera probablement le facteur limitant pour un fichier qui, selon l'algorithme de mise en cache, peut être conservé plus d'un jour. Les navigateurs ont généralement un paramètre pour la quantité d’espace disque qu’ils utilisent pour le cache. De nombreux utilisateurs effacent également leur cache lorsqu'ils ferment leur navigateur. Ainsi, la durée pendant laquelle un tel fichier est mis en cache dépend généralement de:

  • La quantité d'espace de cache que le navigateur a alloué
  • Le nombre de sites Web visités par un utilisateur (et la taille de ces sites)
  • Que l'utilisateur ait ou non fermé son navigateur
Stephen Ostermiller
la source
Pouvez-vous s'il vous plaît préciser "alors Firefox mettrait la ressource en cache pendant 1,5 jours". A partir de quelle date, il va mettre en cache jusqu'à 1,5 jours? Si c'est déjà 15 jours, alors il aurait déjà expiré, n'est-ce pas? Et puisque NOW, dernière modification, augmentera pour toujours, vous voulez dire, il sera mis en cache pour toujours!
myDoggyWritesCode
1
Pas pour toujours. Pendant 1/10 du temps entre le dernier en-tête modifié et le moment du téléchargement. Si cela fait 15 jours pour vous, cela pourrait signifier que 150 jours se sont écoulés depuis la dernière modification du fichier.
Stephen Ostermiller