Pourquoi les navigateurs ne respectent-ils pas les en-têtes de cache pour la demande de page initiale?

8

Je me gratte un peu la tête là-dessus. Un site Drupal que j'exécute définit des en-têtes de cache appropriés qui devraient indiquer que la page peut être mise en cache pendant 15 minutes. Cependant, chaque fois que j'accède à la page, il envoie toujours une demande GET au lieu de charger la page à partir du cache.

Je n'actualise pas forcément la page à chaque fois, ce qui, je suppose, indiquerait au navigateur que je veux vider les caches. Je n'ai aucun contournement du cache en mode développeur activé.

Est-ce simplement le comportement par défaut des navigateurs, ou ai-je raté quelque chose d'évident? Voici les en-têtes de demande / réponse de frapper ma page d'accueil à partir des outils de développement FireFox:

NOTE / EDIT : Certaines personnes ont suggéré que cela était lié au fait que l'en- Expirestête était dans le passé. Cependant, Cache-Controlremplace tout ce qui se trouve dans Expires, comme décrit dans RFC 2616 , Sec 14.9.3. Drupal inclut cela pour désactiver la mise en cache sur les anciens clients HTTP 1.0, qui ne prennent pas en charge l'en- Varytête plus avancé dont Drupal a besoin pour une mise en cache appropriée.

entrez la description de l'image ici

Brian
la source

Réponses:

11

Vous avez un en - tête Vary: Cookie, Accept-Encoding dans la réponse. Cela signifie à peu près que si le proxy (y compris votre navigateur) voulait mettre cette page en cache, il devrait être prêt à mettre en cache une nouvelle version pour chaque cookie éventuellement modifié (ou qui change en accept-encoding). Surtout, il devrait conserver un enregistrement en premier lieu des cookies car ils ont été envoyés dans la demande comme critère de distinction. Je peux imaginer que soit le navigateur nie cela si le cookie est trop volumineux (et donc peu susceptible d'être répété), soit il le nie afin d'éviter que les informations sur les cookies ne soient divulguées via le contenu du cache, ou simplement le contenu du cookie est changé à chaque appel.

Hagen von Eitzen
la source
4
J'étais sur le point de répondre à ma propre question alors que j'arrivais également à cette conclusion. J'ai des cookies Google Analytics, dont l'un change à chaque demande de page, empêchant la mise en cache de la page.
Brian
2

Dans les programmes CMS, certaines pages nécessitent une interaction avec la base de données pour afficher le contenu dynamique spécifique à la demande des utilisateurs. La page entière ne peut pas être mise en cache ou elle n'affichera pas le contenu correct à l'utilisateur.

Un exemple de cela dans la pratique est une page de panier / de paiement de commerce électronique. Étant donné que la page est différente à chaque fois, il n'y a aucun moyen de la mettre en cache complètement. Sans en savoir plus sur la page spécifique, il est difficile de savoir si la page à laquelle vous faites référence nécessite une implication dans la base de données.

JMC
la source
Bien que cela soit vrai, ce n'est pas le cas du mécanisme de mise en cache de page de Drupal (il met littéralement en cache la sortie HTML entière et le fournit pour le trafic "anonyme") et n'est pas vraiment lié à ma question. Ma question est de savoir comment les navigateurs semblent réagir de manière incorrecte aux en-têtes de cache de page appropriés qui sont définis (voir l'image).
Brian
J'ai déjà vu cela pendant le débogage, mais je ne me souviens pas, y a-t-il une raison valable pour que votre en-tête de réponse indique Expires: Nov 1978? Ou c'est peut-être votre réponse.
JMC
1
Dans le code de Drupal, le commentaire au-dessus de cet en-tête se lit comme suit: "Les proxys HTTP / 1.0 ne prennent pas en charge l'en-tête Vary, donc empêchez toute mise en cache en envoyant une date d'expiration dans le passé. Les clients HTTP / 1.1 ignorent l'en-tête Expires si un Cache-Control: la directive max-age = est spécifiée (voir RFC 2616, section 14.9.3). " La date est spécifiquement le créateur de l'anniversaire de Drupal.
Brian
Il est toujours étrange que la date d' expiration ne corresponde pas, par exemple Dernière modification plus âge maximum
Hagen von Eitzen
-1

En plus des autres réponses, l'en- Expirestête appartient au passé, c'est également une raison pour laquelle les navigateurs ne mettront pas la page en cache.

Tero Kilkanen
la source
Ce n'est pas vrai lorsque lorsqu'un en- Cache-Controltête est présent. Il remplace l'en- Expirestête pour les clients HTTP 1.1. Voir ietf.org/rfc/rfc2616.txt , section 14.9.3.
Brian