1620 votes

S'assurer qu'une page web n'est pas mis en cache, sur tous les navigateurs

Nos enquêtes nous ont montré que tous les navigateurs respecter le cache http directives de manière uniforme.

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

  • Internet Explorer versions 6 à 8
  • Firefox version 1.5 - 3.0
  • Safari version 3
  • Opera 9

Notre exigence est venu à partir d'un test de sécurité. Après la connexion à partir de notre site web, vous pouvez appuyer sur le bouton de retour et d'afficher les pages mises en cache.

2696voto

BalusC Points 498232

Le bon ensemble minimal d'en-têtes qui fonctionne sur tous les navigateurs:

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

À l'aide 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.

À L'Aide De Java Servlet:

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

À l'aide de 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.

À l'aide 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.

À l'aide de Ruby on Rails:

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.

À l'aide de Python sur le Flacon:

resp.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
resp.headers["Pragma"] = "no-cache"
resp.headers["Expires"] = "0"

À L'Aide De Google Aller:

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

À l'aide 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" />

À l'aide d'un Apache .Fichier htaccess

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

L' Cache-Control est par le HTTP 1.1 spécification pour les clients (et implicitement requise par certains navigateurs à côté de Expires), l' Pragma est par le protocole HTTP 1.0 spec pour les clients et les mandataires et à l' Expires est par le HTTP 1.1 spec pour les clients et les serveurs proxy. Autres Cache-Control paramètres ne sont pas pertinents si ce qui précède trois sont spécifiés. L' Last-Modified - tête inclus dans la plupart des autres réponses ici est seulement intéressant si vous voulez réellement pour le cache de la demande, de sorte que vous n'avez pas besoin de le spécifier.

Notez que lorsque la page est servi sur HTTP et un en-tête est présent dans les deux la-têtes de réponse HTTP et HTML les balises meta, alors que celui spécifié dans l'en-tête de réponse obtiendrez la préséance sur le code HTML de la balise meta. Le code HTML de la balise meta ne sera utilisé que lorsque la page est affichée à partir du disque local du système de fichiers. Voir aussi W3 spécification HTML chapitre 5.2.2. Occupez-vous de cela lorsque vous ne spécifiez pas par programmation, parce que le serveur web peut savoir à inclure certaines valeurs par défaut. Pour vérifier l'un et à l'autre, vous pouvez voir/déboguer à l'aide de Firebug Net panneau.

Viewing the response headers on the Firebug Net panel

254voto

porneL Points 42805

(hey, tout le monde: merci de ne pas juste bêtement copier et coller tous les en-têtes que vous pouvez trouver)

Tout d'abord, ce que vous essayez d'atteindre ne doit pas être possible selon la spécification HTTP, parce que bouton Retour à l'histoire est pas un cache:

L'histoire mécanismes et les caches sont différents. En particulier, l'histoire mécanismes ne DEVRAIENT PAS essayer de montrer un point de vue sémantique vue transparente de l'état actuel de la ressource. Plutôt, une histoire mécanisme vise à montrer exactement ce que l'utilisateur l'a vu à l'heure à laquelle la ressource a été récupéré.

Le dos est censé retourner dans le temps (le temps lorsque l'utilisateur est connecté), il n'accédez pas en avant précédemment ouvert URL.

Toutefois, il est possible dans la pratique, exactement à cause de "retour après déconnexion" à la panique. Il fonctionne de manière fiable dans des circonstances très particulières:

  • La Page doit être livré plus de HTTPS. Si vous n'êtes pas en utilisant le protocole HTTPS, alors ne vous embêtez pas, il ne sera pas fiable, et que votre page a déjà un gros problème de sécurité.
  • Vous devez envoyer Cache-Control: must-revalidate

Vous jamais besoin de:

  • <meta> avec des en-têtes de cache - ça ne marche pas à tous. Totalement inutile.
  • post-check/pre-check - c'est IE seule directive qui s'applique uniquement aux cachable ressources.
  • L'envoi d'un même en-tête ou deux fois dans la douzaine de pièces. Certains des pires PHP extraits de là en fait remplacer les en-têtes, ce dernier est envoyé.

Si vous le souhaitez, vous pouvez ajouter:

  • no-store si vous l'envoyez à la sécurité des informations sensibles.
  • no-cache ou max-age=0, ce qui fera de ressource (URL) "périmé" et nécessitent des navigateurs afin de vérifier avec le serveur si il y a une version plus récente (must-revalidate implique déjà, c'est même plus fort).
  • Expires avec la date dans le passé pour les clients HTTP/1.0 (bien que réel HTTP/1.0-seuls les clients sont probablement inexistante de nos jours).

109voto

Pacerier Points 15960

Comme porneL dit, ce que vous voulez, c'est de ne pas désactiver le cache, mais pour désactiver l'histoire de la mémoire tampon. Différents navigateurs ont leurs propres manières subtiles de désactiver l'histoire de la mémoire tampon.

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

Dans FireFox (v23.0.1) un de ces travaux:

  1. Cache-Control: no-store

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

  3. Pragma: no-cache (https uniquement)

  4. Vary: * (https uniquement)

Dans l'Opéra (v12.15) nous ne pouvons faire cela en Cache-Control: must-revalidate (https).

Dans Safari (v5.1.7, 7534.57.2) de l'une de ces:

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

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

Dans IE8 (v8.0.6001.18702 IC) de l'une de ces:

  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)

Combinant ci-dessus 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 uniquement)

Notez que le https est nécessaire parce que l'Opéra ne serait pas désactiver l'histoire de la mémoire tampon pour la plaine http pages. Si vous ne pouvez vraiment pas obtenir https et vous êtes prêt à ignorer l'Opéra, le meilleur que vous pouvez faire est ceci:

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

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

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

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

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

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

  13. Pragma: no-cache
    Fail: 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="">
    Fail: 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="">
    Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Succès: IE8

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

  17. Cache-Control: must-revalidate
    Expires: 0
    Fail: 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
    Fail: 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="">
    Fail: 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="">
    Fail: 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="">
    Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Succès: aucun

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

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

  5. Cache-Control: no-cache
    Fail: 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
    Fail: 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: *
    Fail: 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: *
    Fail: Chrome 28, Safari 5.1.7, Opera 12.15
    Succès: FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Fail: 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="">
    Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Succès: Opera 12.15

  11. Cache-Control: must-revalidate, max-age=0
    Fail: 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="">
    Fail: 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="">
    Fail: Chrome 28, Safari 5.1.7
    Succès: FireFox 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    Fail: 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="">
    Fail: 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="">
    Fail: 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: *
    Fail: Chrome 28, Safari 5.1.7, Opera 12.15
    Succès: FireFox 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Fail: 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
    Fail: 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="">
    Fail: 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="">
    Fail: 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: *
    Fail: 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

28voto

Chris Vasselli Points 3697

J'ai trouvé que toutes les réponses sur cette page toujours eu des problèmes. En particulier, j'ai remarqué qu'aucun d'eux s'arrêter à partir de IE8 à l'aide d'une version en cache de la page lorsque vous avez accédé en appuyant sur le bouton de retour.

Après beaucoup de recherches et de tests, j'ai trouvé que les deux seules têtes j'ai vraiment besoin sont:

Cache-Control: no-store
Varier: *

Pour une explication de l'en-tête Vary, découvrez http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

Sur IE6-8, FF1.5-3.5, Chrome 2 Et 3, Safari 4, et de l'Opéra 9-10, ces en-têtes causé la page sera demandé au serveur lorsque vous cliquez sur un lien de la page ou mettre directement l'URL dans la barre d'adresse. Que couvre environ 99% de tous les navigateurs à utiliser à partir de janvier '10.

Sur IE6, et Opera 9 et 10, de frapper le bouton de retour encore causé la version mise en cache pour être chargé. Sur tous les autres navigateurs que j'ai testé, ils ont fait de récupérer une nouvelle version du serveur. Jusqu'à présent, je n'ai pas trouvé de jeu d'en-têtes qui sera la cause de ces navigateurs, afin de ne pas retourner les versions mises en cache des pages lorsque vous appuyez sur le bouton retour.

Mise à jour: Après avoir écrit cette réponse, j'ai réalisé que notre serveur web s'identifie en tant que HTTP 1.0 serveur. Les en-têtes que j'ai énumérés sont celles qui sont correctes afin de réponses à partir d'un de HTTP 1.0 serveur à ne pas être mis en cache par les navigateurs. Pour un serveur HTTP 1.1, regardez BalusC de réponse.

23voto

Edward Wilde Points 5808

Après un peu de recherche, il est venu avec la liste des en-têtes qui semble couvrir la plupart des navigateurs:

Dans ASP.NET nous avons ajouté à l'aide de l'extrait de code 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é à partir de: http://forums.asp.net/t/1013531.aspx

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