web-dev-qa-db-fra.com

Quelle est la différence entre Cache-Control: max-age = 0 et no-cache?

L'en-tête Cache-Control: max-age=0 implique que le contenu est considéré comme périmé (et doit être relu), ce qui est en fait la même chose que Cache-Control: no-cache.

602
rubyruy

J'avais cette même question et j'ai trouvé quelques informations dans mes recherches (votre question a été soulevée comme l'un des résultats). Voici ce que j'ai déterminé ...

L'en-tête Cache-Control comporte deux côtés. Un côté est l'endroit où il peut être envoyé par le serveur Web (alias "serveur d'origine"). L'autre côté est l'endroit où il peut être envoyé par le navigateur (alias "user agent").


Lorsque envoyé par le serveur d'origine

Je crois que max-age=0 dit simplement aux caches (et aux agents utilisateurs) que la réponse est périmée dès le départ et qu’ils DEVRAIENT DONC revalider le réponse (par exemple avec l’en-tête If-Not-Modified) avant d’utiliser une copie en cache, alors que no-cache leur dit qu’ils DOIVENT revalider avant d'utiliser une copie en cache. De 14.9.1 Qu'est ce qui est cachable :

no-cache

... un cache NE DOIT PAS utiliser la réponse pour satisfaire une demande ultérieure sans revalidation réussie avec le serveur Origin. Cela permet à un serveur Origin d'empêcher la mise en cache même par des caches configurés pour renvoyer des réponses obsolètes aux demandes des clients.

En d'autres termes, les caches peuvent parfois choisir d'utiliser une réponse périmée (bien que je pense qu'ils doivent ensuite ajouter un en-tête Warning), mais no-cache indique qu'ils ne sont pas autorisés à utiliser une réponse périmée, peu importe. quoi. Peut-être voudriez-vous que le comportement DEVRAIT - revalider lorsque des statistiques de baseball sont générées dans une page, mais vous voudriez que le MUST - revalider le comportement lorsque vous avez généré la réponse à un achat en ligne.

Bien que votre commentaire soit correct lorsque vous dites que no-cache n'est pas censé empêcher le stockage, cela pourrait en fait être une autre différence lorsque vous utilisez no-cache. Je suis tombé sur une page, Directives de contrôle du cache démystifiées , qui dit (je ne peux pas en garantir l'exactitude):

En pratique, IE et Firefox ont commencé à traiter la directive no-cache comme si elle indiquait au navigateur de ne même pas mettre en cache la page. Nous avons commencé à observer ce comportement il y a environ un an. Nous pensons que cette modification a été provoquée par l'utilisation généralisée (et incorrecte) de cette directive pour empêcher la mise en cache.

...

Notez que dernièrement, "cache-control: no-cache" a également commencé à se comporter comme la directive "no-store".

En passant, il me semble que Cache-Control: max-age=0, must-revalidate devrait fondamentalement signifier la même chose que Cache-Control: no-cache. Alors peut-être que c'est un moyen d'obtenir le DOIT - revalider le comportement de no-cache, tout en évitant la migration apparente de no-cache faire la même chose que no-store (c'est-à-dire pas de cache que ce soit)?


Quand envoyé par l'agent utilisateur

Je crois que la réponse de shahkalpesh s'applique au côté de l'agent utilisateur. Vous pouvez également consulter 13.2.6 Disambiguating Multiple Responses .

Si un agent utilisateur envoie une requête avec Cache-Control: max-age=0 (alias "revalidation de bout en bout"), chaque cache en cours de route revalidera son entrée de cache (par exemple, avec l'en-tête If-Not-Modified) tout le chemin vers le serveur d'origine. Si la réponse est alors 304 (non modifié), l'entité mise en cache peut être utilisée.

D'autre part, l'envoi d'une demande avec Cache-Control: no-cache (alias "reload de bout en bout") ne se revalide pas et le serveur NE DOIT PAS utilise une copie en cache pour répondre.

569
Michael Krebs

max-age =

Cela équivaut à cliquer sur Actualiser , ce qui signifie que vous devez me donner la dernière copie à moins que je ne dispose déjà de la dernière copie.

pas de cache

Ceci maintient Shift tout en cliquant sur Actualiser, ce qui signifie simplement refaire tout ce que vous voulez.

53
Gunnar Cheng

Vieille question maintenant, mais si quelqu'un d'autre trouve cela par le biais d'une recherche, il semble qu'Internet Explorer 9 s'en servira pour configurer le comportement des ressources lors de l'utilisation des boutons Précédent et Suivant. Lorsque max-age = 0 est utilisé, le navigateur utilise la dernière version lors de l'affichage d'une ressource sur une presse précédente/suivante. Si no-cache est utilisé, la ressource sera extraite.

Plus de détails sur la mise en cache IE9 peuvent être vus sur ce article de blog de mise en cache msdn .

34
El Yobo

Dans mes récents tests avec IE8 et Firefox 3.5, il semble que les deux soient compatibles RFC. Cependant, ils diffèrent par leur "convivialité" pour le serveur Origin. IE8 traite les réponses no-cache avec la même sémantique que max-age=0,must-revalidate. Cependant, Firefox 3.5 semble considérer que no-cache équivaut à no-store, ce qui est gênant pour la performance et l’utilisation de la bande passante.

Squid Cache, par défaut, ne semble jamais rien stocker avec un en-tête no-cache, tout comme Firefox.

Mon conseil serait de définir public,max-age=0 pour les ressources non sensibles pour lesquelles vous souhaitez vérifier la fraîcheur de chaque demande, tout en conservant les avantages de la mise en cache en termes de performances et de bande passante. Pour les éléments par utilisateur ayant la même considération, utilisez private,max-age=0.

J'éviterais totalement l'utilisation de no-cache, car il semble que certains navigateurs l'ont bâti et que les caches les plus répandus remplacent l'équivalent fonctionnel de no-store.

De plus, n'émulez pas Akamai et Limelight. Bien que leur activité principale repose essentiellement sur des baies de mise en cache massives et qu'ils devraient être des experts, ils ont tout intérêt à ce que davantage de données soient téléchargées à partir de leurs réseaux. Google n'est peut-être pas un bon choix pour l'émulation. Ils semblent utiliser max-age=0 ou no-cache de manière aléatoire en fonction de la ressource.

27
rmalayter
 max-age 
 Lorsqu'un cache intermédiaire est forcé, au moyen d'une directive max-age = 0, de revalider 
 sa propre entrée de cache et que le client a fourni sa propre Dans la demande, le validateur 
 fourni peut différer du validateur actuellement stocké avec l’entrée de cache. 
 Dans ce cas, le cache PEUT utiliser l'un ou l'autre des validateurs pour formuler sa propre requête sans que 
 N'affecte la transparence sémantique. 
 
 Cependant, le choix du validateur peut affecter les performances. La meilleure approche consiste pour le cache intermédiaire 
 À utiliser son propre validateur lors de la requête. Si le serveur répond 
 Avec 304 (non modifié), le cache peut alors renvoyer sa copie maintenant validée au client 
 Avec une réponse de 200 (OK). Si le serveur répond avec une nouvelle entité et un validateur de cache, 
 Toutefois, le cache intermédiaire peut comparer le validateur renvoyé à celui fourni dans 
 À la demande du client, à l'aide de la fonction de comparaison renforcée. Si le validateur du client est égal à 
 Égal à celui du serveur d'origine, le cache intermédiaire renvoie simplement 304 (non 
 Modifié). Sinon, il renvoie la nouvelle entité avec une réponse 200 (OK). 

 Si une demande inclut la directive no-cache, elle NE DEVRA PAS inclure min-fresh, 
 Max-stale ou max-age. 

courtoisie: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

N'acceptez pas cela comme réponse - je vais devoir le lire pour comprendre son véritable usage :)

20
shahkalpesh

En passant, il convient de noter que certains appareils mobiles, notamment Apple, tels que l'iPhone/iPad, ignorent complètement les en-têtes tels que no-cache, no-store, Expires: 0 ou tout autre moyen que vous pouvez essayer de forcer. ne pas réutiliser des pages de formulaire expirées.

Cela nous a causé beaucoup de maux de tête alors que nous essayons de résoudre le problème de l'iPad d'un utilisateur, le laissant endormi sur une page qu'il a atteinte via un processus de formulaire, par exemple l'étape 2 sur 3, puis le périphérique ignore totalement le magasin/Les directives de cache, et pour autant que je sache, prend simplement ce qui est un instantané virtuel de la page de son dernier état, c'est-à-dire ignore ce qui lui a été dit explicitement, et, pas seulement cela, prend une page qui ne devrait pas être stockée et de le stocker sans le vérifier à nouveau, ce qui entraîne, entre autres choses, d’étranges problèmes de session.

J'ajoute simplement ceci au cas où quelqu'un viendrait et ne comprendrait pas pourquoi ils commettent des erreurs de session avec notamment des iphones et des ipads, qui semblent être de loin les pires contrevenants dans ce domaine.

J'ai effectué des tests de débogueur assez approfondis avec ce problème, et c'est ma conclusion, les périphériques ignorent complètement ces directives.

Même en utilisation régulière, j'ai constaté que certains mobiles ne vérifiaient pas totalement les nouvelles versions via, par exemple, Expires: 0, puis vérifiaient les dates de dernière modification pour déterminer si elles devaient en obtenir une nouvelle.

Cela n’arrive tout simplement pas, alors j’ai été obligé d’ajouter des chaînes de requête aux fichiers css/js sur lesquels je devais imposer des mises à jour, ce qui incite les stupides périphériques mobiles à penser que c’est un fichier qu’il ne possède pas, comme: .css? v = 1, puis v = 2 pour une mise à jour css/js. Cela fonctionne en grande partie.

Soit dit en passant, les navigateurs d’utilisateur, s’ils sont laissés à leurs valeurs par défaut, à partir de 2016, comme je le découvre en permanence (nous apportons BEAUCOUP de modifications et de mises à jour de notre site), ne parviennent pas non plus à vérifier les dates de dernière modification de ces fichiers, mais la requête méthode de chaîne résout ce problème. C’est quelque chose que j’ai remarqué avec les clients et les employés de bureau qui ont tendance à utiliser les paramètres par défaut d’utilisateur normal sur leurs navigateurs et ne sont pas au courant des problèmes de mise en cache avec css/js etc. ce qui signifie que les paramètres par défaut de leurs navigateurs, principalement MSIE/Firefox, ne font pas ce qu'on leur dit de faire, ils ignorent les modifications, les dates de dernière modification et ne sont pas validés, même si Expires: 0 est défini explicitement.

C’était un bon fil de discussion avec de nombreuses informations techniques, mais il est également important de noter à quel point le support de ces éléments est médiocre, en particulier pour les appareils mobiles. Tous les quelques mois, je dois ajouter plus de couches de protection contre le non-respect des commandes d'en-tête qu'ils reçoivent ou pour interpréter correctement ces commandes.

12
Lizardx

Je ne suis pas un expert en cache, mais Mark Nottingham l'est. Voici son mise en cache de la documentation . Il a également d'excellents liens dans la section Références.

D'après mes lectures de ces documents, il semble que max-age=0 puisse permettre au cache d'envoyer une réponse en cache aux demandes arrivées au "même moment", où "même heure" signifie qu'elles sont assez proches les unes des autres pour paraître simultanées au message. cache, mais no-cache ne le ferait pas.

12
Hank Gay

J'écris une série d'articles qui couvrent ces sujets en profondeur, ce qui à mon humble avis n'est pas suffisamment discuté entre développeurs.

Navigateurs, mandataires privés et CDN:
https://medium.com/free-code-camp/http-caching-in-depth-part-1-a853c6af99db

Cache-Control & Varyhttps://medium.com/@lojacquemin/an-in-depth-introduction-to-http-caching-cache-control-vary-e3229815ddf4

0
Radioreve

La différence est que no-cache (no-store sur Firefox) empêche tout type de cache. Cela peut être utile pour empêcher les pages contenant du contenu sécurisé d’être écrites sur le disque et pour les pages qui doivent toujours être mises à jour même si elles sont redistribuées avec le bouton Précédent.

max-age = 0 indique qu'une entrée de cache est périmée et nécessite une nouvelle validation, mais n'empêche pas la mise en cache. Souvent, les navigateurs ne valident les ressources qu'une fois par session. Par conséquent, le contenu peut ne pas être mis à jour tant que le site n'est pas visité dans une nouvelle session.

En règle générale, les navigateurs ne suppriment pas les entrées de cache expirées, à moins qu'ils ne récupèrent de l'espace pour du contenu plus récent lorsque le cache du navigateur est plein. L'utilisation de no-store, no-cache permet de supprimer explicitement une entrée de cache.

0
HttpWatchSupport