1820 votes

Comment contrôler la mise en cache des pages web, sur tous les navigateurs ?

Nos investigations nous ont montré que tous les navigateurs ne respectent pas les directives de cache HTTP de manière uniforme.

Pour des raisons de sécurité, nous ne voulons pas que certaines pages de notre application soient mises en cache, jamais, par le navigateur web. Cela doit fonctionner pour au moins les navigateurs suivants :

  • Internet Explorer 6+.
  • Firefox 1.5+.
  • Safari 3+
  • Opera 9+.
  • Chrome

Notre exigence provient d'un test de sécurité. Après s'être déconnecté de notre site Web, vous pouviez appuyer sur le bouton retour et afficher les pages en cache.

0 votes

Juste pour l'ipad Safari, est-ce que [ceci][1] aide ? [1] : stackoverflow.com/questions/24524248/

0 votes

Le plus simple est d'utiliser : max-age=10 . Ce n'est pas parfait car la page sera mise en cache pendant 10 secondes. Mais c'est la solution la moins "spaghetti" qui existe. En outre, cette solution permet parfois d'améliorer considérablement les performances des sites Web dynamiques qui utilisent des proxys inversés. (Votre lent script php sera appelé une fois toutes les 10 secondes et sera ensuite mis en cache par le proxy inverse. Une fois par 10 secondes est bien mieux qu'une fois par visiteur).

4 votes

3016voto

BalusC Points 498232

Introduction

L'ensemble minimum correct d'en-têtes qui fonctionne sur tous les clients (et proxies) mentionnés :

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

El Cache-Control est conforme à la spécification HTTP 1.1 pour les clients et les mandataires (et implicitement requis par certains clients à côté de l'option Expires ). Le site Pragma est conforme à la spécification HTTP 1.0 pour les clients préhistoriques. Le site Expires est conforme aux spécifications HTTP 1.0 et 1.1 pour les clients et les mandataires. Dans HTTP 1.1, le Cache-Control a la priorité sur Expires Il s'agit donc, après tout, de proxies HTTP 1.0 uniquement.

Si vous ne vous préoccupez pas d'IE6 et de sa mise en cache défectueuse lorsque vous servez des pages sur HTTPS avec seulement no-store alors vous pouvez omettre Cache-Control: no-cache .

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

Si vous ne vous souciez pas d'IE6 ni des clients HTTP 1.0 (HTTP 1.1 a été introduit en 1997), alors vous pouvez omettre Pragma .

Cache-Control: no-store, must-revalidate
Expires: 0

Si vous ne vous préoccupez pas non plus des proxies HTTP 1.0, alors vous pouvez omettre Expires .

Cache-Control: no-store, must-revalidate

D'un autre côté, si le serveur inclut automatiquement un fichier Date vous pouvez théoriquement omettre l'en-tête Cache-Control aussi et s'appuyer sur Expires seulement.

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

Mais cela peut échouer si, par exemple, l'utilisateur final manipule la date du système d'exploitation et que le logiciel client s'y fie.

Autre Cache-Control des paramètres tels que max-age ne sont pas pertinents si les Cache-Control sont spécifiés. Le site Last-Modified L'en-tête, qui figure dans la plupart des autres réponses, est le suivant uniquement intéressant si vous veulent réellement pour mettre la requête en cache, donc vous n'avez pas besoin de le spécifier du tout.

Comment le régler ?

Utilisation de PHP :

header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.

En utilisant Java Servlet, ou Node.js :

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.

Utiliser ASP.NET-MVC

Response.Cache.SetCacheability(HttpCacheability.NoCache);  // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

Utilisation de l'API Web ASP.NET :

// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
    NoCache = true,
    NoStore = true,
    MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString()); 

Utilisation d'ASP.NET :

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

Utilisation d'ASP.NET Core v3

// using Microsoft.Net.Http.Headers
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
Response.Headers[HeaderNames.Expires] = "0";
Response.Headers[HeaderNames.Pragma] = "no-cache";

Utilisation d'ASP :

Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.

Utilisation de Ruby on Rails :

headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.

Utilisation de Python/Flask :

response = make_response(render_template(...))
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response.headers["Pragma"] = "no-cache" # HTTP 1.0.
response.headers["Expires"] = "0" # Proxies.

Utilisation de Python/Django :

response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.

Utilisation de Python/Pyramid :

request.response.headerlist.extend(
    (
        ('Cache-Control', 'no-cache, no-store, must-revalidate'),
        ('Pragma', 'no-cache'),
        ('Expires', '0')
    )
)

Utiliser Go :

responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.

Utilisation de Clojure (require Ring utils) :

(require '[ring.util.response :as r])
(-> response
  (r/header "Cache-Control" "no-cache, no-store, must-revalidate")
  (r/header "Pragma" "no-cache")
  (r/header "Expires" 0))

Utilisation d'Apache .htaccess fichier :

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

Utilisation de HTML :

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

Métabalises HTML et en-têtes de réponse HTTP

Il est important de savoir que lorsqu'une page HTML est servie par une connexion HTTP, et qu'un en-tête est présent dans le fichier les deux les en-têtes de réponse HTTP et le HTML <meta http-equiv> alors celle spécifiée dans l'en-tête de la réponse HTTP aura la priorité sur la métabalise HTML. La métabalise HTML n'est utilisée que lorsque la page est affichée à partir d'un système de fichiers sur disque local via une balise file:// URL. Voir aussi W3 HTML spec chapitre 5.2.2 . Faites attention lorsque vous ne les spécifiez pas par programme, car le serveur Web peut notamment inclure des valeurs par défaut.

En général, vous feriez mieux de no spécifier les métabalises HTML pour éviter toute confusion de la part des starters et s'appuyer sur les en-têtes de réponse HTTP en dur. De plus, les balises <meta http-equiv> Les balises sont invalide en HTML5. Seuls les http-equiv valeurs énumérées dans Spécification HTML5 sont autorisés.

Vérification des en-têtes de réponse HTTP réels

Pour vérifier l'un et l'autre, vous pouvez les voir/déboguer dans le moniteur de trafic HTTP de la boîte à outils du développeur du navigateur Web. Vous pouvez y accéder en appuyant sur F12 dans Chrome/Firefox23+/IE9+, puis en ouvrant le panneau de l'onglet "Réseau" ou "Net", et enfin en cliquant sur la requête HTTP qui vous intéresse pour découvrir tous les détails de la requête et de la réponse HTTP. Le site capture d'écran ci-dessous vient de Chrome :

Chrome developer toolset HTTP traffic monitor showing HTTP response headers on stackoverflow.com

Je veux aussi définir ces en-têtes sur les téléchargements de fichiers.

Tout d'abord, cette question et cette réponse visent les "pages web" (pages HTML), et non les "téléchargements de fichiers" (PDF, zip, Excel, etc.). Vous feriez mieux de les mettre en cache et d'utiliser un identifiant de version de fichier quelque part dans le chemin URI ou la chaîne de requête pour forcer un nouveau téléchargement en cas de modification du fichier. Si vous appliquez de toute façon ces en-têtes no-cache aux téléchargements de fichiers, faites attention au bogue d'IE7/8 lorsqu'il s'agit de servir un téléchargement de fichier via HTTPS au lieu de HTTP. Pour plus de détails, voir IE ne peut pas télécharger foo.jsf. IE n'a pas été en mesure d'ouvrir ce site Internet. Le site demandé est soit indisponible, soit introuvable. .

20 votes

Cette solution ne semble pas être complète. J'ai essayé cette solution sur IE 8 et j'ai constaté que le navigateur charge une version en cache lorsque vous appuyez sur le bouton retour.

19 votes

Il est probable que votre méthodologie de test était mauvaise. Peut-être la page était-elle déjà dans le cache ? Les en-têtes étaient peut-être incorrects/superflus ? Peut-être avez-vous regardé la mauvaise requête ? Etc

0 votes

@BalusC : Certaines personnes m'ont dit que le réglage des expirations à 0 ne fonctionnera pas dans certains cas, il est donc préférable de le définir sur une date passée. J'ai également obtenu des résultats intéressants. commentaire dans php.net

276voto

porneL Points 42805

(Hé, tout le monde : s'il vous plaît, ne vous contentez pas de copier-coller sans réfléchir tous les en-têtes que vous pouvez trouver)

Tout d'abord, L'historique du bouton retour est pas un cache :

Le modèle de fraîcheur (section 4.2) ne s'applique pas nécessairement aux mécanismes d'historique. C'est-à-dire qu'un mécanisme d'historique peut afficher une représentation précédente même si elle a expiré.

Dans l'ancienne spécification HTTP, le libellé était encore plus fort, indiquant explicitement aux navigateurs de ne pas tenir compte des directives de mise en cache pour l'historique du bouton retour.

Back est censé remonter dans le temps (au moment où l'utilisateur était connecté). Il ne permet pas de naviguer en avant vers une URL précédemment ouverte.

Cependant, dans la pratique, le cache peut influencer le bouton retour, dans des circonstances très spécifiques :

  • Page doit être livré sur HTTPS sinon, la suppression du cache ne sera pas fiable. De plus, si vous n'utilisez pas le protocole HTTPS, votre page est vulnérable au vol d'identifiants de bien d'autres manières.
  • Vous devez envoyer Cache-Control: no-store, must-revalidate (certains navigateurs observent no-store et certains observent must-revalidate )

Vous jamais ont besoin :

  • <meta> avec des en-têtes de cache - cela ne fonctionne pas du tout. Totalement inutile.
  • post-check / pre-check - il s'agit d'une directive réservée à IE qui ne s'applique qu'à cachable ressources.
  • Envoyer le même en-tête deux fois ou en plusieurs fois. Certains snippets PHP remplacent les en-têtes précédents, ce qui fait que seul le dernier est envoyé.

Si vous voulez, vous pouvez ajouter :

  • no-cache o max-age=0 qui rendra la ressource (URL) "périmée" et obligera les navigateurs à vérifier auprès du serveur s'il existe une version plus récente ( no-store l'implique déjà de manière encore plus forte).
  • Expires avec une date dans le passé pour les clients HTTP/1.0 (bien que réel Les clients exclusivement HTTP/1.0 sont totalement inexistants de nos jours).

Bonus : Le nouveau RFC sur la mise en cache HTTP .

2 votes

Cela aura-t-il un effet secondaire sur les performances du site en termes de temps de chargement ? comment no-store, no-cache, must-revalidate affectent-ils les performances ?

1 votes

@RamanGhai La désactivation du cache nuit généralement aux performances (et les 3 options que vous avez mentionnées désactivent le cache). Elle peut rendre inefficaces les CDN et les proxys des FAI (par exemple, ceux couramment utilisés par les opérateurs mobiles). Elle ne nuit pas au premier chargement par un nouvel utilisateur (hormis le problème du proxy), mais la navigation ultérieure peut être beaucoup plus lente.

1 votes

@porneL vous déclarez que nous devons envoyer Cache-Control: must-revalidate . Pourquoi ne pas envoyer Cache-Control: no-cache desde no-cache implique déjà must-revalidate ? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

124voto

Pacerier Points 15960

Comme l'a dit @Kornel, ce que vous voulez, ce n'est pas désactiver le cache, mais désactiver le tampon d'historique. Les différents navigateurs ont leurs propres moyens subtils de désactiver le tampon de l'historique.

Dans Chrome (v28.0.1500.95 m), nous pouvons le faire uniquement en Cache-Control: no-store .

Dans FireFox (v23.0.1), n'importe lequel de ces éléments fonctionnera :

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (https uniquement)

  3. Pragma: no-cache (https uniquement)

  4. Vary: * (https uniquement)

Dans Opera (v12.15) nous ne pouvons le faire que par Cache-Control: must-revalidate (https uniquement).

Dans Safari (v5.1.7, 7534.57.2), n'importe lequel de ces éléments fonctionnera :

  1. Cache-Control: no-store
    <body onunload=""> en html

  2. Cache-Control: no-store (https uniquement)

Dans IE8 (v8.0.6001.18702IC), n'importe lequel de ces éléments fonctionnera :

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate
    Expires: 0

  5. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache (https uniquement)

  7. Vary: * (https uniquement)

En combinant les éléments ci-dessus, nous obtenons cette solution qui fonctionne pour Chrome 28, FireFox 23, IE8, Safari 5.1.7 et Opera 12.15 : Cache-Control: no-store, must-revalidate (https uniquement)

Notez que https est nécessaire car Opera ne désactiverait pas la mémoire tampon de l'historique pour les pages http ordinaires. Si vous ne pouvez vraiment pas obtenir https et que vous êtes prêt à ignorer Opera, le mieux que vous puissiez faire est ceci :

Cache-Control: no-store
<body onunload="">

Vous trouverez ci-dessous les journaux bruts de mes tests :

HTTP :

  1. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Opera 12.15
    Succès : Chrome 28, FireFox 23, IE8, Safari 5.1.7

  2. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Opera 12.15
    Succès : Chrome 28, FireFox 23, IE8, Safari 5.1.7

  3. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Échec : Safari 5.1.7, Opera 12.15
    Succès : Chrome 28, FireFox 23, IE8

  4. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Échec : Safari 5.1.7, Opera 12.15
    Succès : Chrome 28, FireFox 23, IE8

  5. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Le succès : IE8

  6. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès : IE8

  7. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès : IE8

  8. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès : IE8

  9. Cache-Control: no-store
    Échec : Safari 5.1.7, Opera 12.15
    Succès : Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Échec : Opera 12.15
    Succès : Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès : IE8

  12. Vary: *
    Échec : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Succès : aucun

  13. Pragma: no-cache
    Échec : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Succès : aucun

  14. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès : IE8

  15. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès : IE8

  16. Cache-Control: must-revalidate, max-age=0
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès : IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès : IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Échec : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès : IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Succès : aucun

HTTPS :

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Échec : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Succès : aucun

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Échec : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Succès : aucun

  3. Vary: *
    Échec : Chrome 28, Safari 5.1.7, Opera 12.15
    Succès : FireFox 23, IE8

  4. Pragma: no-cache
    Échec : Chrome 28, Safari 5.1.7, Opera 12.15
    Succès : FireFox 23, IE8

  5. Cache-Control: no-cache
    Échec : Chrome 28, Safari 5.1.7, Opera 12.15
    Succès : FireFox 23, IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Échec : Chrome 28, Safari 5.1.7, Opera 12.15
    Succès : FireFox 23, IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Échec : Chrome 28, Safari 5.1.7, Opera 12.15
    Succès : FireFox 23, IE8

  8. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Échec : Chrome 28, Safari 5.1.7, Opera 12.15
    Succès : FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Échec : Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Succès : Opera 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    Échec : Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Succès : Opera 12.15

  11. Cache-Control: must-revalidate, max-age=0
    Échec : Chrome 28, FireFox 23, Safari 5.1.7
    Succès : IE8, Opera 12.15

  12. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Chrome 28, Safari 5.1.7
    Succès : FireFox 23, IE8, Opera 12.15

  13. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Chrome 28, Safari 5.1.7
    Succès : FireFox 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    Échec : Opera 12.15
    Succès : Chrome 28, FireFox 23, IE8, Safari 5.1.7

  15. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Opera 12.15
    Succès : Chrome 28, FireFox 23, IE8, Safari 5.1.7

  16. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Échec : Opera 12.15
    Succès : Chrome 28, FireFox 23, IE8, Safari 5.1.7

  17. Cache-Control: private, no-cache
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Échec : Chrome 28, Safari 5.1.7, Opera 12.15
    Succès : FireFox 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Échec : Chrome 28, FireFox 23, Safari 5.1.7,
    Succès : IE8, Opera 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Échec : Chrome 28, FireFox 23, Safari 5.1.7,
    Succès : IE8, Opera 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Échec : Chrome 28, FireFox 23, Safari 5.1.7,
    Succès : IE8, Opera 12.15

  21. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Échec : Chrome 28, FireFox 23, Safari 5.1.7,
    Succès : IE8, Opera 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Échec : Chrome 28, Safari 5.1.7
    Succès : FireFox 23, IE8, Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    Échec : aucun
    Succès : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15

5 votes

Je sais que cela a été posté il y a quelques années mais c'était une lecture intéressante. Ce problème me rend fou depuis quelques mois maintenant, personne ne semble vraiment savoir comment gérer le contrôle du cache. J'ai vu quelques personnes utiliser le <body onunload=""> mais cela ressemble plus à un moyen de contourner le problème actuel. J'ai essayé d'utiliser le .htaccess et de modifier les en-têtes de cette façon, si j'utilise HTTPS, cela devrait-il fonctionner de cette façon ? C'est surtout dans Safari que le problème se pose le plus.

6 votes

@Jordan, D'après les journaux ci-dessus, si vous avez HTTPS, alors l'ajout de Cache-Control: no-store ferait l'affaire. <body onunload=""> n'est nécessaire que si vous ne disposez pas de HTTPS.

35voto

Chris Vasselli Points 3697

J'ai constaté que toutes les réponses de cette page présentaient encore des problèmes. En particulier, j'ai remarqué qu'aucune d'entre elles n'empêchait IE8 d'utiliser une version en cache de la page lorsque vous y accédiez en appuyant sur le bouton "Back".

Après de nombreuses recherches et tests, j'ai découvert que les deux seuls en-têtes dont j'avais vraiment besoin étaient les suivants :

Cache-Control : no-store
Vary : *

Pour une explication de l'en-tête Vary, consultez le document suivant http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

Sur IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 et Opera 9-10, ces en-têtes provoquaient la demande de la page au serveur lorsque vous cliquiez sur un lien vers la page, ou que vous mettiez l'URL directement dans la barre d'adresse. Cela couvre environ 99% de tous les navigateurs utilisés en janvier 2010.

Sur IE6 et Opera 9-10, le fait d'appuyer sur le bouton "retour" entraîne toujours le chargement de la version en cache. Sur tous les autres navigateurs que j'ai testés, ils ont récupéré une nouvelle version du serveur. Jusqu'à présent, je n'ai pas trouvé d'ensemble d'en-têtes permettant à ces navigateurs de ne pas renvoyer les versions en cache des pages lorsque vous appuyez sur le bouton Précédent.

Mise à jour : Après avoir écrit cette réponse, j'ai réalisé que notre serveur web s'identifie comme un serveur HTTP 1.0. Les en-têtes que j'ai énumérés sont les bons pour que les réponses d'un serveur HTTP 1.0 ne soient pas mises en cache par les navigateurs. Pour un serveur HTTP 1.1, regardez les en-têtes de BalusC. réponse .

5 votes

Cela fonctionne pour le bouton de retour d'IE8 ! Après avoir essayé toutes les autres suggestions, l'ajout de l'en-tête "Vary : *" est apparemment la seule chose qui peut forcer IE8 à recharger la page lorsque l'utilisateur appuie sur le bouton retour. Et ceci fait fonctionnent sur les serveurs HTTP/1.1.

0 votes

Combiné avec les en-têtes suggérés par BarlusC, plus un extrait JS qui appelle window.location.reload() lorsque l'événement onPageShow se déclenche avec l'attribut "persisted" (nécessaire pour Safari), chaque que j'ai testé avec succès force un rechargement du serveur lorsque l'utilisateur utilise le bouton Retour.

2 votes

@CoreDumpError, oh vous ne devez pas supposer que JavaScript est activé.

28voto

Edward Wilde Points 5808

Après quelques recherches, nous avons établi la liste suivante d'en-têtes qui semble couvrir la plupart des navigateurs :

Dans ASP.NET, nous les avons ajoutés à l'aide de l'extrait suivant :

Response.ClearHeaders(); 
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0 
Response.AppendHeader("Expires", "Sat, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0 

Trouvé dans : http://forums.asp.net/t/1013531.aspx

41 votes

@bart : Plus gênant encore, le 26 juillet 1997 était un samedi et non un lundi...

7 votes

Cache-Control: no-cache y Cache-Control: private clash - vous ne devriez jamais avoir les deux ensemble : le premier indique aux navigateurs et aux proxies de ne pas mettre du tout en cache, le second indique aux proxies de ne pas mettre en cache mais laisse les navigateurs conserver leur propre copie privée. Je ne sais pas quel paramètre le navigateur suivra, mais il est peu probable qu'il soit cohérent entre les navigateurs et les versions.

1 votes

N'utilisez pas le pré-contrôle et le post-contrôle. blogs.msdn.com/b/ieinternals/archive/2009/07/20/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X