Question Comment contrôler la mise en cache des pages Web, dans 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, déjà, 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 est venue d'un test de sécurité. Après vous être déconnecté de notre site Web, vous pouvez appuyer sur le bouton Retour et afficher les pages mises en cache.


1223
2017-09-08 12:08


origine


Réponses:


introduction

Le jeu d'en-têtes minimum correct qui fonctionne avec tous les clients (et procurations) mentionnés:

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

le Cache-Control est conforme à la spécification HTTP 1.1 pour les clients et les proxies (et implicitement requis par certains clients à côté de Expires). le Pragma est conforme à la spécification HTTP 1.0 pour les clients préhistoriques. le 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 préséance sur Expires, donc c'est après tout pour les proxies HTTP 1.0 seulement.

Si vous ne vous souciez pas de IE6 et de sa mise en cache brisée lors de la diffusion de pages via HTTPS avec seulement no-store, alors vous pourriez omettre Cache-Control: no-cache.

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

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

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

Si vous ne vous souciez pas non plus des proxies HTTP 1.0, vous pouvez omettre Expires.

Cache-Control: no-store, must-revalidate

D'un autre côté, si le serveur inclut automatiquement un Date en-tête, alors vous pourriez théoriquement omettre Cache-Control aussi et compter sur Expires seulement.

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

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

Autre Cache-Control paramètres tels que max-age sont hors de propos si le susdit Cache-Control les paramètres sont spécifiés. le Last-Modified en-tête comme inclus dans la plupart des autres réponses est ici seulement intéressant si vous veut vraiment pour mettre en cache la requête, vous n'avez donc pas besoin de la spécifier du tout.

Comment le définir?

En utilisant PHP:

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

Utilisation de 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.

Utilisation d'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.

En utilisant 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.

En utilisant Ruby on Rails, ou Python / Flask:

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.

En utilisant 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 / Pyramide:

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

Utiliser Google 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.

Utiliser 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>

En utilisant HTML4:

<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" />

Balises méta HTML vs en-têtes de réponse HTTP

Il est important de savoir que lorsqu'une page HTML est servie via une connexion HTTP et qu'un en-tête est présent dans tous les deux les en-têtes de réponse HTTP et le HTML <meta http-equiv> tags, alors celui spécifié dans l'en-tête de réponse HTTP aura la priorité sur la balise meta HTML. La méta-balise HTML ne sera utilisée que lorsque la page est vue à partir du système de fichiers du disque local via un file:// URL Voir également W3 HTML spec chapitre 5.2.2. Faites attention à cela 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 juste ne pas spécifiez les balises META HTML pour éviter la confusion par les démarreurs, et comptez sur les en-têtes de réponse HTTP. De plus, spécifiquement ceux <meta http-equiv> les tags sont invalide en HTML5. Seulement le 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 l'ensemble d'outils de développement de webbrowser. Vous pouvez y accéder en appuyant sur F12 dans Chrome / Firefox23 + / IE9 +, puis en ouvrant le panneau à onglet "Réseau" ou "Réseau", puis 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 ci-dessous vient de Chrome:

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

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

Tout d'abord, cette question et réponse est ciblée sur les «pages web» (pages HTML), pas sur les «téléchargements de fichiers» (PDF, zip, Excel, etc.). Il vaut mieux les mettre en cache et utiliser un identifiant de version de fichier quelque part dans le chemin de l'URI ou dans la chaîne de requête pour forcer le téléchargement sur un fichier modifié. Lors de l'application de ces en-têtes non-cache sur les téléchargements de fichiers de toute façon, alors méfiez-vous du bug IE7 / 8 lors du service de téléchargement d'un 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 pu ouvrir ce site internet. Le site demandé est indisponible ou introuvable.


2121
2018-03-30 23:08



(hé, tout le monde: s'il vous plaît ne pas simplement copier et coller tous les en-têtes que vous pouvez trouver)

Tout d'abord, L'historique des boutons arrière est pas un cache:

Le modèle de fraîcheur (section 4.2) ne s'applique pas nécessairement aux mécanismes de l'historique. Autrement dit, 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 cache pour l'historique des boutons de retour.

Le retour est censé remonter dans le temps (au moment où l'utilisateur était connecté). Il ne navigue pas vers une URL précédemment ouverte.

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

  • Page doit être livré sur HTTPS, sinon ce cache-busting ne sera pas fiable. De plus, si vous n'utilisez pas HTTPS, votre page est vulnérable au vol de connexion à bien d'autres égards.
  • Vous devez envoyer Cache-Control: no-store, must-revalidate (certains navigateurs observent no-store et certains observent must-revalidate)

Toi jamais besoin de l'un des éléments suivants:

  • <meta> avec les en-têtes de cache - cela ne fonctionne pas du tout. Totalement inutile.
  • post-check/pre-check - C'est la directive IE-only qui ne s'applique qu'à cachable Ressources.
  • Envoi du même en-tête deux fois ou en douzaine de parties. Certains extraits PHP remplacent en fait les en-têtes précédents, ce qui fait que seul le dernier est envoyé.

Si vous le souhaitez, vous pouvez ajouter:

  • no-cache ou max-age=0, ce qui rendra la ressource (URL) "obsolète" et obligera les navigateurs à vérifier avec le serveur s'il existe une version plus récente (no-storecela implique déjà plus fort).
  • Expires avec une date dans le passé pour les clients HTTP / 1.0 (bien que réal Les clients HTTP / 1.0-only sont complètement inexistants ces jours-ci).

Prime: Le nouveau RFC de mise en cache HTTP.


205
2017-08-29 16:50



Comme l'a dit porneL, ce que vous voulez, c'est ne pas désactiver le cache, mais désactiver le tampon d'historique. Différents navigateurs ont leurs propres façons subtiles de désactiver le tampon d'historique.

Dans Chrome (v28.0.1500.95 m), nous ne pouvons le faire que par Cache-Control: no-store.

Dans FireFox (v23.0.1), l'un d'entre eux fonctionnera:

  1. Cache-Control: no-store

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

  3. Pragma: no-cache (https seulement)

  4. Vary: * (https seulement)

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

Dans Safari (v5.1.7, 7534.57.2) l'un d'entre eux fonctionnera:

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

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

Dans IE8 (v8.0.6001.18702IC) l'un de ceux-ci 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 seulement)

  7. Vary: * (https seulement)

La combinaison de ce qui précède nous donne 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 seulement)

Notez que https est nécessaire car Opera ne désactiverait pas le tampon d'historique pour les pages http simples. Si vous ne pouvez pas obtenir https et que vous êtes prêt à ignorer Opera, le mieux que vous puissiez faire est le suivant:

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

Ci-dessous montre les logs 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
    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
    Fail: none
    Succès: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15


82
2018-06-15 02:40



J'ai trouvé la route web.config utile (j'ai essayé de l'ajouter à la réponse mais elle ne semble pas avoir été acceptée donc je la poste ici)

<configuration>
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
            <!-- HTTP 1.1. -->
            <add name="Pragma" value="no-cache" />
            <!-- HTTP 1.0. -->
            <add name="Expires" value="0" />
            <!-- Proxies. -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

Et voici la façon expresse / node.js de faire la même chose:

app.use(function(req, res, next) {
    res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
    res.setHeader('Pragma', 'no-cache');
    res.setHeader('Expires', '0');
    next();
});

24
2018-01-14 23:35



J'ai trouvé que toutes les réponses sur cette page avaient encore des problèmes. En particulier, j'ai remarqué qu'aucun d'entre eux n'empêcherait IE8 d'utiliser une version mise en cache de la page lorsque vous y accédiez en appuyant sur le bouton Précédent.

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

Cache-Control: pas de magasin
  Varier: *

Pour une explication de l'en-tête Vary, consultez 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 ont provoqué la demande de la page sur le serveur lorsque vous avez cliqué sur un lien vers la page ou mis l'URL directement dans la barre d'adresse. Cela couvre environ 99% de tous les navigateurs utilisés à partir de Jan '10.

Sur IE6 et Opera 9-10, le fait de cliquer sur le bouton de retour provoquait 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 trouvé aucun ensemble d'en-têtes qui empêchera ces navigateurs de renvoyer des versions de pages mises en cache lorsque vous cliquez sur le bouton Précédent.

Mettre à 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 répertoriés sont les correctes 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 BalusC répondre.


22
2017-09-08 12:11



Après un peu de recherche, nous avons trouvé la liste suivante d'en-têtes qui semblaient couvrir la plupart des navigateurs:

Dans ASP.NET, nous avons ajouté ceux-ci en utilisant 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", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0 

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


18
2017-09-17 14:18



L'utilisation de l'en-tête pragma dans la réponse est un conte d'épouses. RFC2616 ne le définit que comme en-tête de requête

http://www.mnot.net/cache_docs/#PRAGMA


8
2017-09-18 10:36



DISCLAIMER: Je suggère fortement de lire la réponse de @ BalusC. Après avoir lu le tutoriel de mise en cache suivant: http://www.mnot.net/cache_docs/ (Je vous recommande de le lire aussi), je crois que c'est correct. Cependant, pour des raisons historiques (et parce que je l'ai testé moi-même), je vais inclure ma réponse originale ci-dessous:


J'ai essayé la réponse "acceptée" pour PHP, qui n'a pas fonctionné pour moi. Puis j'ai fait un peu de recherche, j'ai trouvé une légère variante, je l'ai testée et ça a marché. C'est ici:

header('Cache-Control: no-store, private, no-cache, must-revalidate');     // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false);  // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');                  // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');

Cela devrait fonctionner. Le problème était que lors du réglage de la même partie de l'en-tête deux fois, si le false n'est pas envoyé comme deuxième argument à la fonction d'en-tête, la fonction d'en-tête écrasera simplement la précédente header() appel. Ainsi, lors de la configuration du Cache-Control, par exemple si l'on ne veut pas mettre tous les arguments en un header() appel de fonction, il doit faire quelque chose comme ceci:

header('Cache-Control: this');
header('Cache-Control: and, this', false);

Voir plus de documentation complète ici.


7
2018-06-13 15:23



Il y a un bug dans IE6

Le contenu avec "Content-Encoding: gzip" est toujours mis en cache même si vous utilisez "Cache-Control: no-cache".

http://support.microsoft.com/kb/321722

Vous pouvez désactiver la compression gzip pour les utilisateurs IE6 (vérifiez l'agent utilisateur pour "MSIE 6")


7
2017-09-08 12:14