Introdução
O conjunto mínimo correto de cabeçalhos que funciona em todos os clientes (e proxies) mencionados:
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
O Cache-Control
é pelo HTTP 1.1 especificação para clientes e proxies (e implicitamente exigido por alguns clientes ao lado Expires
). O valor Pragma
é de acordo com a especificação HTTP 1.0 para clientes pré-históricos. O Expires
é de acordo com as especificações HTTP 1.0 e 1.1 para clientes e proxies. No HTTP 1.1, a Cache-Control
precedência tem precedência Expires
; portanto, é apenas para proxies HTTP 1.0.
Se você não se importa com o IE6 e seu cache interrompido ao veicular apenas páginas HTTPS no-store
, poderá omitir Cache-Control: no-cache
.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
Se você não se importa com os clientes IE6 e HTTP 1.0 (HTTP 1.1 foi introduzido em 1997), poderá omitir Pragma
.
Cache-Control: no-store, must-revalidate
Expires: 0
Se você também não se importa com proxies HTTP 1.0, poderá omitir Expires
.
Cache-Control: no-store, must-revalidate
Por outro lado, se o servidor incluir automaticamente um Date
cabeçalho válido , você também poderá omitir teoricamente Cache-Control
e confiar Expires
apenas nele .
Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0
Mas isso pode falhar se, por exemplo, o usuário final manipular a data do sistema operacional e o software cliente confiar nela.
Outros Cache-Control
parâmetros, como max-age
são irrelevantes, se os Cache-Control
parâmetros acima mencionados forem especificados. O Last-Modified
cabeçalho, incluído na maioria das outras respostas aqui, é interessante apenas se você realmente deseja armazenar em cache a solicitação, portanto, não é necessário especificá-la.
Como configurá-lo?
Usando PHP:
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
Usando 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.
Usando o 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.
Usando a API da Web do 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());
Usando o 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.
Usando o 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";
Usando 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.
Usando 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.
Usando 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.
Usando Python / Pyramid:
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
Usando 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.
Usando o .htaccess
arquivo 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>
Usando 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 tags HTML x cabeçalhos de resposta HTTP
Importante saber é que quando uma página HTML é servido em uma conexão HTTP, e um cabeçalho está presente em ambos os cabeçalhos de resposta HTTP e HTML <meta http-equiv>
marcas, então o especificado no cabeçalho de resposta HTTP terá precedência sobre a meta tag HTML. A metatag HTML só será usada quando a página for visualizada em um sistema de arquivos em disco local por meio de um file://
URL. Veja também o capítulo 5.2.2 das especificações HTML do W3 . Tome cuidado com isso quando você não os especificar programaticamente, porque o servidor da Web pode incluir alguns valores padrão.
Geralmente, é melhor você não especificar as meta tags HTML para evitar confusão por iniciantes e confiar em cabeçalhos de resposta HTTP rígidos. Além disso, especificamente essas <meta http-equiv>
tags são inválidas no HTML5. Somente os http-equiv
valores listados na especificação HTML5 são permitidos.
Verificando os cabeçalhos de resposta HTTP reais
Para verificar um e outro, você pode vê-los / depurá-los no monitor de tráfego HTTP do conjunto de ferramentas do desenvolvedor do navegador da web. Você pode chegar lá pressionando F12 no Chrome / Firefox23 + / IE9 + e abrindo o painel da guia "Rede" ou "Rede" e clicando na solicitação HTTP de interesse para descobrir todos os detalhes sobre a solicitação e resposta HTTP. A captura de tela abaixo é do Chrome:
Também quero definir esses cabeçalhos nos downloads de arquivos
Antes de tudo, esta pergunta e resposta são direcionadas para "páginas da web" (páginas HTML), não para "downloads de arquivos" (PDF, zip, Excel, etc). É melhor colocá-los em cache e usar algum identificador de versão de arquivo em algum lugar no caminho do URI ou na string de consulta para forçar um download novamente em um arquivo alterado. De qualquer maneira, ao aplicar esses cabeçalhos sem cache nos downloads de arquivos, tome cuidado com o bug do IE7 / 8 ao enviar um download de arquivo por HTTPS em vez de HTTP. Para detalhes, consulte IE não pode baixar foo.jsf. O IE não conseguiu abrir este site. O site solicitado não está disponível ou não pode ser encontrado .