introduzione
Il set minimo corretto di intestazioni che funziona su tutti i client (e proxy) citati:
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
È Cache-Control
conforme alle specifiche HTTP 1.1 per client e proxy (e implicitamente richiesto da alcuni client accanto Expires
). È Pragma
conforme alle specifiche HTTP 1.0 per i client preistorici. Il Expires
è per HTTP 1.0 e 1.1 spec per i clienti e proxy. In HTTP 1.1, ha la Cache-Control
precedenza Expires
, quindi dopo tutto è solo per i proxy HTTP 1.0.
Se non ti interessa IE6 e la sua memorizzazione nella cache interrotta quando si pubblicano solo pagine su HTTPS no-store
, allora potresti ometterlo Cache-Control: no-cache
.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
Se non ti interessano i client IE6 né HTTP 1.0 (HTTP 1.1 è stato introdotto nel 1997), allora potresti ometterlo Pragma
.
Cache-Control: no-store, must-revalidate
Expires: 0
Se non ti interessa nemmeno i proxy HTTP 1.0, potresti ometterti Expires
.
Cache-Control: no-store, must-revalidate
D'altra parte, se il server include automaticamente Date
un'intestazione valida , è possibile anche teoricamente omettere Cache-Control
e fare affidamento Expires
solo.
Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0
Ma ciò potrebbe non riuscire se, ad esempio, l'utente finale modifica la data del sistema operativo e il software client si basa su di essa.
Altri Cache-Control
parametri come max-age
sono irrilevanti se Cache-Control
vengono specificati i parametri sopra menzionati . L' Last-Modified
intestazione inclusa nella maggior parte delle altre risposte qui è interessante solo se si desidera effettivamente memorizzare nella cache la richiesta, quindi non è necessario specificarla affatto.
Come impostarlo?
Utilizzando PHP:
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
Utilizzando Java Servlet o 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.
Utilizzando 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.
Utilizzo dell'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());
Utilizzando 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.
Utilizzando 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";
Utilizzando 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.
Utilizzando Ruby on Rails o 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.
Utilizzando 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.
Utilizzando Python / Pyramid:
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
Utilizzando 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.
Utilizzando il .htaccess
file 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>
Utilizzando 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">
Meta tag HTML e intestazioni di risposta HTTP
È importante sapere che quando una pagina HTML viene pubblicata su una connessione HTTP ed è presente un'intestazione sia nelle intestazioni della risposta HTTP che nei <meta http-equiv>
tag HTML , quella specificata nell'intestazione della risposta HTTP avrà la precedenza sul meta tag HTML. Il meta tag HTML verrà utilizzato solo quando la pagina viene visualizzata da un file system del disco locale tramite un file://
URL. Vedere anche il capitolo 5.2.2 delle specifiche HTML di W3 . Abbi cura di questo quando non li specifichi a livello di codice perché il server web può in particolare includere alcuni valori predefiniti.
In generale, è meglio non specificare i meta tag HTML per evitare confusione da parte dei principianti e fare affidamento su intestazioni di risposta HTTP rigide. Inoltre, in particolare quei <meta http-equiv>
tag non sono validi in HTML5. Sono ammessi solo i http-equiv
valori elencati nella specifica HTML5 .
Verifica delle intestazioni di risposta HTTP effettive
Per verificare l'uno e l'altro, è possibile visualizzarli / eseguirne il debug nel monitoraggio del traffico HTTP del set di strumenti per sviluppatori di webbrowser. Puoi arrivarci premendo F12 in Chrome / Firefox23 + / IE9 +, quindi aprendo il pannello della scheda "Rete" o "Rete", quindi facendo clic sulla richiesta HTTP di interesse per scoprire tutti i dettagli sulla richiesta e la risposta HTTP. Lo screenshot seguente è di Chrome:
Voglio impostare quelle intestazioni anche sui download di file
Prima di tutto, questa domanda e risposta sono indirizzate su "pagine web" (pagine HTML), non su "download di file" (PDF, zip, Excel, ecc.). Faresti meglio a memorizzarli nella cache e utilizzare un identificatore di versione del file da qualche parte nel percorso URI o nella querystring per forzare un nuovo download su un file modificato. Quando applichi comunque quelle intestazioni senza cache sui download di file, fai attenzione al bug IE7 / 8 quando offri un download di file su HTTPS anziché HTTP. Per i dettagli, vedere IE non può scaricare foo.jsf. Internet Explorer non è stato in grado di aprire questo sito Internet. Il sito richiesto non è disponibile o non può essere trovato .