introduction
L'ensemble minimal correct d'en-têtes qui fonctionne sur tous les clients (et proxy) mentionnés:
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
C'est Cache-Control
par la spécification HTTP 1.1 pour les clients et les proxys (et implicitement requis par certains clients à côté Expires
). C'est Pragma
selon la spécification HTTP 1.0 pour les clients préhistoriques. C'est Expires
selon les spécifications HTTP 1.0 et 1.1 pour les clients et les proxys. Dans HTTP 1.1, le Cache-Control
prend le pas sur Expires
, donc c'est après tout pour les proxy HTTP 1.0 uniquement.
Si vous ne vous souciez pas d'IE6 et de sa mise en cache cassée lors de la diffusion de pages via HTTPS uniquement no-store
, vous pouvez 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 ni HTTP 1.0 (HTTP 1.1 a été introduit en 1997), vous pouvez l'omettre Pragma
.
Cache-Control: no-store, must-revalidate
Expires: 0
Si vous ne vous souciez pas non plus des proxy HTTP 1.0, vous pouvez les omettre Expires
.
Cache-Control: no-store, must-revalidate
D'un autre côté, si le serveur inclut automatiquement un en- Date
tête valide , vous pouvez également théoriquement l'omettre Cache-Control
et vous y fier Expires
uniquement.
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.
D'autres Cache-Control
paramètres tels que ne max-age
sont pas pertinents si les Cache-Control
paramètres susmentionnés sont spécifiés. L' en- Last-Modified
tête compris dans la plupart des autres réponses ici est seulement intéressant si vous voulez vraiment mettre en cache la demande, de sorte que vous n'avez pas besoin de préciser tout.
Comment le régler?
Utiliser 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.
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, ou Python / Flask:
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 / 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')
)
)
Utilisation de 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 du .htaccess
fichier Apache :
<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">
Méta-balises 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 à la fois dans les en-têtes de réponse HTTP et dans les <meta http-equiv>
balises HTML , celui spécifié dans l'en-tête de réponse HTTP aura la priorité sur la balise Meta HTML. La balise Meta HTML ne sera utilisée que lorsque la page est affichée à partir d'un système de fichiers de disque local via une file://
URL. Voir aussi le chapitre 5.2.2 de la spécification HTML W3 . Soyez prudent lorsque vous ne les spécifiez pas par programme car le serveur Web peut notamment inclure des valeurs par défaut.
En règle générale, vous feriez mieux de ne pas spécifier les balises META HTML pour éviter toute confusion par les démarreurs et compter sur des en-têtes de réponse HTTP durs. De plus, spécifiquement ces <meta http-equiv>
balises ne sont pas valides en HTML5. Seules les http-equiv
valeurs répertoriées dans la spécification HTML5 sont autorisées.
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 du jeu 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 à onglets "Réseau" ou "Net", puis en cliquant sur la demande HTTP d'intérêt pour découvrir tous les détails sur la demande et la réponse HTTP. La capture d'écran ci-dessous provient de Chrome:
Je souhaite également définir ces en-têtes sur les téléchargements de fichiers
Tout d'abord, cette question et réponse sont ciblées sur les "pages Web" (pages HTML), et non sur 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 une nouvelle téléchargement sur un fichier modifié. Lorsque vous appliquez ces en-têtes sans cache sur les téléchargements de fichiers, méfiez-vous du bogue IE7 / 8 lors du service de téléchargement de fichiers 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 .