Como controlar o cache de página web, em todos os navegadores?
-
09-06-2019 - |
Pergunta
Nossas investigações têm nos mostrado que nem todos os navegadores respeito cache http directivas de uma maneira uniforme.
Por razões de segurança, nós não queremos que determinadas páginas do nosso aplicativo para ser armazenada em cache, nunca, pelo navegador da web.Isso deve funcionar durante, pelo menos, os seguintes navegadores:
- Internet Explorer 6+
- Firefox 1.5+
- Safari 3+
- Opera 9+
- Chrome
Nossa exigência veio a partir de um teste de segurança.Depois de sair do nosso site, você pode pressionar o botão voltar e ler as páginas em cache.
Solução
Introdução
O correto conjunto mínimo de cabeçalhos que funciona com todos os clientes mencionados (e proxies):
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
O Cache-Control
é de acordo com o HTTP 1.1 especificação de clientes e proxies (e implicitamente exigido por alguns clientes ao lado Expires
).O Pragma
é de acordo com o HTTP 1.0 especificação para clientes pré-históricos.O Expires
é de acordo com o HTTP 1.0 e 1.1 especificação de clientes e proxies.HTTP 1.1, o Cache-Control
tem precedência sobre Expires
, assim que é, afinal, de HTTP 1.0 somente proxies.
Se você não se preocupa com o IE6 e o seu quebrado cache até o momento de servir páginas através de HTTPS apenas com no-store
, e , em seguida, você pode omitir Cache-Control: no-cache
.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
Se você não se preocupa com o IE6, nem de HTTP 1.0 clientes (HTTP 1.1 foi introduzido 1997), em seguida, você pode omitir Pragma
.
Cache-Control: no-store, must-revalidate
Expires: 0
Se você não se preocupa com HTTP 1.0 proxies, em seguida, você pode omitir Expires
.
Cache-Control: no-store, must-revalidate
Por outro lado, se o servidor de auto-inclui válido Date
cabeçalho e, em seguida, você poderia, teoricamente, omitir Cache-Control
muito e dependem de Expires
só.
Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0
Mas pode falhar se o exemplo:o utilizador manipula a data do sistema operacional e o software cliente é confiar nele.
Outros Cache-Control
parâmetros, tais como max-age
são irrelevantes se o referido Cache-Control
os parâmetros são especificados.O Last-Modified
cabeçalho incluído na maioria das outras respostas aqui apenas interessante se você na verdade, quer para armazenar em cache o pedido, assim você não precisa especificá-lo em tudo.
Como definir isso?
Usando o 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.
Utilizando 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 ASP.NET a API da Web:
// `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 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 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.
Utilizando Ruby on Rails, ou Python/Frasco:
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/Pirâmide:
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
Usando Ir:
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 Apache .htaccess
arquivo:
<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 o 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 em HTML vs cabeçalhos de resposta HTTP
Importante é saber que quando uma página HTML é servido através de uma conexão HTTP, e um cabeçalho está presente em ambos os cabeçalhos de resposta HTTP e o HTML <meta http-equiv>
tags, então o especificado no cabeçalho de resposta de HTTP terá precedência sobre a meta tag HTML.A meta tag HTML será usado apenas quando a página é visualizada a partir do disco local sistema de arquivos através de uma file://
URL.Veja também W3 HTML spec capítulo 5.2.2.Tome cuidado com isso quando você não especificar programaticamente, porque o servidor pode saber, incluir alguns valores padrão.
Geralmente, é melhor você apenas não especificar as meta tags em HTML para evitar confusão por começar, e dependem de difícil cabeçalhos de resposta HTTP.Além disso, especificamente aqueles <meta http-equiv>
tags são inválido em HTML5.Só o http-equiv
valores listados em Especificação do HTML5 são permitidos.
Verificar a real cabeçalhos de resposta HTTP
Para verificar um e de outra, você pode ver/debug-los em HTTP monitor de tráfego de webbrowser do desenvolvedor do conjunto de ferramentas.Você pode chegar lá pressionando F12 no Chrome/Firefox23+/IE9+ e, em seguida, abrir a "Rede" ou "Net" guia do painel e, em seguida, clicando em a solicitação HTTP de interesse para descobrir todos os detalhes sobre a solicitação e a resposta HTTP.O imagem abaixo é a partir do google Chrome:
Eu quero definir os cabeçalhos no arquivo de downloads muito
Primeiro de tudo, essa questão e a resposta é alvo da "web pages" (páginas HTML), e não de "downloads de arquivos" (PDF, zip, Excel, etc).É melhor você tê-los armazenados em cache e fazer uso de algum arquivo identificador de versão em algum lugar no caminho do URI ou querystring para forçar um download em um arquivo alterado.Ao aplicar os não-cabeçalhos de cache em downloads de arquivos de qualquer maneira, então cuidado com o IE7/8 erro ao servir um arquivo para download através de HTTPS em vez de HTTP.Para detalhes, consulte IE não pode baixar o arquivo foo.jsf.IE não foi capaz de abrir este site da internet.O site solicitado não está disponível ou não pode ser encontrado.
Outras dicas
(hey, todo mundo:por favor, não basta displicentemente copiar e colar todos os cabeçalhos que você pode encontrar)
Primeiro de tudo, Botão voltar história é não um cache:
O frescor do modelo (Seção 4.2) não se aplica necessariamente a história mecanismos.Isto é, um mecanismo de histórico pode apresentar uma representação anterior, mesmo se ele tiver expirado.
No antigo HTTP spec a redação foi ainda mais forte, explicitamente dizendo navegadores para ignorar a cache directivas para o botão voltar história.
De volta é suposto para voltar no tempo (o momento em que o usuário foi conectado).Ele não navegue para a frente para um aberto anteriormente URL.
No entanto, na prática, o cache pode influenciar o botão voltar, em circunstâncias muito específicas:
- Página deve ser entregue HTTPS, caso contrário, esta cache-busting não ser confiável.Além disso, se você não estiver usando HTTPS e, em seguida, sua página é vulnerável login para roubar de muitas outras maneiras.
- Você deve enviar
Cache-Control: no-store, must-revalidate
(alguns navegadores observarno-store
e alguns observarmust-revalidate
)
Você nunca precisar de qualquer um:
<meta>
com cabeçalhos de cache — ele não funciona em todos.Totalmente inútil.post-check
/pre-check
— é o IE-only que só se aplica a cachable recursos.- Envio mesmo cabeçalho ou duas vezes na dezena de peças.Alguns PHP trechos lá fora, na verdade, substituir a anterior cabeçalhos, resultando em apenas um passado a ser enviada.
Se você quiser, você pode adicionar:
no-cache
oumax-age=0
, o que vai fazer de recursos (URL) "obsoletos" e exigir os navegadores, verifique com o servidor se há uma versão mais recente (no-store
já sugere isso mesmo mais forte).Expires
com uma data no passado para clientes HTTP/1.0 (embora real HTTP/1.0-apenas clientes são completamente inexistentes nos dias de hoje).
Bônus: O novo cache de HTTP RFC.
Como porneL afirmou, o que você quer não é para desativar o cache, mas para desativar o buffer de histórico.Diferentes navegadores têm suas próprias maneiras sutis para desativar o buffer de histórico.
No google Chrome (v28.0.1500.95 m), podemos fazer isso apenas por Cache-Control: no-store
.
No FireFox (v23.0.1) qualquer um desses vai funcionar:
Cache-Control: no-store
Cache-Control: no-cache
https (apenas)Pragma: no-cache
https (apenas)Vary: *
https (apenas)
No Opera (v12.15) nós só podemos fazer isso Cache-Control: must-revalidate
https (apenas).
No Safari (v5.1.7, 7534.57.2) qualquer um desses vai funcionar:
Cache-Control: no-store
<body onunload="">
em htmlCache-Control: no-store
https (apenas)
No IE8 (v8.0.6001.18702 IC) qualquer um desses vai funcionar:
Cache-Control: must-revalidate, max-age=0
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: must-revalidate
Expires: 0
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
https (apenas)Vary: *
https (apenas)
A combinação acima nos dá esta solução que funciona para o google Chrome 28, FireFox 23, IE8, Safari 5.1.7, e Opera 12.15: Cache-Control: no-store, must-revalidate
https (apenas)
Note que o https é necessária porque o Opera não iria desativar o buffer de histórico de simples páginas http.Se você realmente não pode começar com https e você está preparado para ignorar o Opera, o melhor que você pode fazer é esta:
Cache-Control: no-store
<body onunload="">
Abaixo mostra o raw logs dos meus testes:
HTTP:
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="">
Falhar:Opera 12h15
Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7Cache-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="">
Falhar:Opera 12h15
Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Falhar:O Safari 5.1.7, Opera 12h15
Sucesso:Chrome 28, FireFox 23, IE8Cache-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: *
Falhar:O Safari 5.1.7, Opera 12h15
Sucesso:Chrome 28, FireFox 23, IE8Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Cache-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="">
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Cache-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="">
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Cache-Control: no-store
Falhar:O Safari 5.1.7, Opera 12h15
Sucesso:Chrome 28, FireFox 23, IE8Cache-Control: no-store
<body onunload="">
Falhar:Opera 12h15
Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7Cache-Control: no-cache
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Vary: *
Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12h15
Sucesso:nenhumPragma: no-cache
Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12h15
Sucesso:nenhumCache-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="">
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Cache-Control: must-revalidate, max-age=0
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Cache-Control: must-revalidate
Expires: 0
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
Sucesso:IE8Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
Pragma: no-cache
Vary: *
<body onunload="">
Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12h15
Sucesso:nenhum
HTTPS:
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12h15
Sucesso:nenhumCache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12h15
Sucesso:nenhumVary: *
Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
Sucesso:FireFox 23, IE8Pragma: no-cache
Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
Sucesso:FireFox 23, IE8Cache-Control: no-cache
Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
Sucesso:FireFox 23, IE8Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
Sucesso:FireFox 23, IE8Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
Sucesso:FireFox 23, IE8Cache-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: *
Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
Sucesso:FireFox 23, IE8Cache-Control: must-revalidate
Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7
Sucesso:Opera 12h15Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
<body onunload="">
Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7
Sucesso:Opera 12h15Cache-Control: must-revalidate, max-age=0
Falhar:Chrome 28, FireFox 23, Safari 5.1.7
Sucesso:IE8, Opera 12h15Cache-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="">
Falhar:Chrome 28, Safari 5.1.7
Sucesso:FireFox 23, IE8, Opera 12h15Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falhar:Chrome 28, Safari 5.1.7
Sucesso:FireFox 23, IE8, Opera 12h15Cache-Control: no-store
Falhar:Opera 12h15
Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falhar:Opera 12h15
Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7Cache-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="">
Falhar:Opera 12h15
Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7Cache-Control: private, no-cache
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
Sucesso:FireFox 23, IE8Cache-Control: must-revalidate
Expires: 0
Falhar:Chrome 28, FireFox 23, Safari 5.1.7,
Sucesso:IE8, Opera 12h15Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Falhar:Chrome 28, FireFox 23, Safari 5.1.7,
Sucesso:IE8, Opera 12h15Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Falhar:Chrome 28, FireFox 23, Safari 5.1.7,
Sucesso:IE8, Opera 12h15Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Falhar:Chrome 28, FireFox 23, Safari 5.1.7,
Sucesso:IE8, Opera 12h15Cache-Control: private, must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Falhar:Chrome 28, Safari 5.1.7
Sucesso:FireFox 23, IE8, Opera 12h15Cache-Control: no-store, must-revalidate
Falhar:nenhum
Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12h15
Eu encontrei a web.configuração de rota útil (tentei adicioná-lo para a resposta, mas não parece ter sido aceite para publicação aqui)
<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>
E aqui está a express / node.js modo de fazer o mesmo:
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();
});
Eu achei que todas as respostas sobre esta página ainda tinha problemas.Em particular, reparei que nenhum deles iria parar IE8 de utilizar uma versão em cache da página, quando acessado por apertar o botão de volta.
Depois de muita pesquisa e testes, descobri que apenas dois cabeçalhos eu realmente necessários foram:
Cache-Control:não armazenar
Variar:*
Para uma explicação do cabeçalho Vary, confira http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6
No IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 e Opera 9-10, esses cabeçalhos causou a página a ser pedido a partir do servidor quando você clica em um link para a página, ou colocar a URL diretamente na barra de endereço.Que cobre cerca de 99% de todos os navegadores em uso a partir de Janeiro '10.
No IE6, e Opera 9-10, apertar o botão de volta ainda causou a versão em cache para ser carregado.Em todos os outros navegadores que testei, eles fizeram buscar uma nova versão do servidor.Até agora, não encontrei qualquer conjunto de cabeçalhos que fará com que esses navegadores não para voltar para versões em cache de páginas quando você aperta o botão voltar.
Atualização: Depois de escrever esta resposta, eu percebi que o nosso servidor web é identificar-se como um servidor de HTTP 1.0.Os cabeçalhos eu listei são as corretas para que respostas de um servidor de HTTP 1.0 para não ser armazenado em cache pelo navegador.Para um servidor de HTTP 1.1, olhar BalusC do responder.
Após um pouco de pesquisa, nós viemos acima com a seguinte lista de cabeçalhos que parecia cobrir a maioria dos navegadores:
- Expira:Seg, 26 de Julho de 1997, 05:00:00 GMT
- Cache-Control: no-cache, privada, deve-revalidar, obsoletas máximo=0, pós-verifique=0, pré-verifique=0 n-loja
- Pragma:no-cache
No ASP.NET nós adicionamos estas usando o seguinte trecho:
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
Encontrado a partir de: http://forums.asp.net/t/1013531.aspx
O uso da pragma cabeçalho na resposta é uma mulher conto.RFC2616 apenas a define como um cabeçalho de solicitação
ISENÇÃO de responsabilidade:Eu sugiro fortemente a leitura @BalusC resposta.Depois de ler o seguinte cache tutorial: http://www.mnot.net/cache_docs/ (Eu recomendo que você leia isso, também), eu acredito ser correto.No entanto, por razões históricas (e porque eu testei eu mesmo), vou incluir a minha resposta original abaixo:
Eu tentei o 'aceite' resposta para PHP, o que não funciona para mim.Então eu fiz um pouco de pesquisa, encontrei uma ligeira variante, testei, e funcionou.Aqui está ele:
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');
Que deve funcionar.O problema foi que, quando a configuração a mesma parte do cabeçalho duas vezes, se o false
não é enviado como o segundo argumento para o cabeçalho da função, cabeçalho, a função de simplesmente substituir o anterior header()
chamada.Assim, ao definir o Cache-Control
, por exemplo, se um não quer colocar todos os argumentos em um header()
chamada de função, ele deve fazer algo como isto:
header('Cache-Control: this');
header('Cache-Control: and, this', false);
Veja a mais completa documentação aqui.
Há um bug no IE6
Conteúdo com "Content-Encoding:gzip" é sempre armazenada em cache, mesmo se você usar o "Cache-Control:no-cache".
http://support.microsoft.com/kb/321722
Você pode desabilitar a compressão gzip para o IE6 usuários (verifique o agente de utilizador para "MSIE 6")
Para ASP.NET Núcleo, criar um simples middleware classe:
public class NoCacheMiddleware
{
private readonly RequestDelegate m_next;
public NoCacheMiddleware( RequestDelegate next )
{
m_next = next;
}
public async Task Invoke( HttpContext httpContext )
{
httpContext.Response.OnStarting( ( state ) =>
{
// ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
httpContext.Response.Headers.Append( "Pragma", "no-cache" );
httpContext.Response.Headers.Append( "Expires", "0" );
return Task.FromResult( 0 );
}, null );
await m_next.Invoke( httpContext );
}
}
em seguida, registrá-lo com o Startup.cs
app.UseMiddleware<NoCacheMiddleware>();
Certifique-se de que você adicione isso em algum lugar depois
app.UseStaticFiles();
A RFC para HTTP 1.1 diz o bom método é adicionar um Cabeçalho de HTTP para:
Cache-Control:no-cache
Navegadores mais antigos podem ignorar isso, se eles não estão devidamente compatível com HTTP 1.1.Para aqueles que você pode tentar o cabeçalho:
Pragma:no-cache
Este também é suposto para trabalhar para o HTTP 1.1 navegadores.
Estas directivas não mitigar qualquer risco de segurança.Eles são realmente destinados a força do UA para atualizar informações temporárias, não manter UA sendo a retenção de informações.Ver esta pergunta semelhante.Pelo menos, não há nenhuma garantia de que quaisquer roteadores, proxies, etc.não vai ignorar a cache de directivas bem.
Em uma nota mais positiva, políticas sobre o acesso físico a computadores, instalação de software, e como vai colocá-lo milhas à frente da maioria das empresas em termos de segurança.Se o consumidor dessas informações são membros do público, a única coisa que você pode realmente fazer é ajudá-los a entender que, uma vez que a informação atinge sua máquina, que máquina é seus responsabilidade, não a sua.
Configuração modificada cabeçalho de http para alguma data em 1995 normalmente faz o truque.
Aqui está um exemplo:
Expires: Wed, 15 Nov 1995 04:58:08 GMT Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT Cache-Control: no-cache, must-revalidate
O Documentação do PHP para o cabeçalho de função tem, ao invés de um exemplo completo (contribuído por terceiros):
header('Pragma: public');
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0', false); // HTTP/1.1
header ("Pragma: no-cache");
header("Expires: 0", false);
Se você está enfrentando problemas de download com o IE6-IE8 através de SSL e cache:não-cache cabeçalho (e valores similares) com arquivos do MS Office, você pode usar o cache:privado,não cabeçalho da loja e retorno de arquivo no POST pedido.Ele funciona.
no meu caso eu corrigir o problema no chrome com este
<form id="form1" runat="server" autocomplete="off">
onde eu preciso limpar o conteúdo de um previus formulário de dados quando os usuários clicam no botão de volta por motivos de segurança
Eu tive os melhores e mais consistentes resultados em todos os navegadores, definindo Pragma:no-cache
Os cabeçalhos na resposta dada por BalusC não impede que o Safari 5 (e possivelmente versões mais antigas, bem como a exibição de conteúdo da cache do browser quando utilizar o botão voltar do navegador.Uma maneira de evitar isso é adicionar um vazio manipulador de evento onunload atributo da tag body:
<body onunload="">
Este hack aparentemente quebra a frente-trás cache no Safari: Há um cross-browser evento onload ao clicar no botão voltar?
Aceito respostas não aparecem para trabalhar para o IIS7+, vamos por o grande número de perguntas sobre cabeçalhos de cache não sendo enviado em II7:
- Algo está forçando as respostas para ter cache-control:privada no IIS7
- O IIS7:Configuração De Cache Não Está Funcionando...por quê?
- O IIS7 + ASP.NET MVC Cache do Cliente Cabeçalhos de Não Trabalhar
- Conjunto de controle de cache para páginas aspx
- Cache-control:não armazenar, deve-revalidar não é enviado para o navegador do cliente no IIS7 + ASP.NET MVC
E assim por diante
Aceito resposta está correta nas quais os cabeçalhos devem ser definidos, mas não em como elas devem ser definidas.Desta forma, trabalha com o IIS7:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");
A primeira linha define Cache-control
para no-cache
, e a segunda linha adiciona os outros atributos no-store, must-revalidate
Também, apenas para uma boa medida, certifique-se de que você redefinir o ExpiresDefault
em seu .htaccess
do arquivo se você estiver usando-a para ativar o armazenamento em cache.
ExpiresDefault "access plus 0 seconds"
Depois, você pode usar ExpiresByType
para definir valores específicos para os arquivos que você deseja armazenar em cache:
ExpiresByType image/x-icon "access plus 3 month"
Isso também pode vir a calhar se o seu dinâmica e.g. arquivosphp, etc.estão sendo armazenados em cache pelo navegador, e você não consegue descobrir o porquê.Seleção ExpiresDefault
.
Em adição aos cabeçalhos de considerar que serve a sua página através de https.Muitos navegadores não armazenar em cache o https por padrão.
//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}
// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>
Para concluir BalusC -> RESPONDER Se você estiver usando o perl que você pode usar CGI para adicionar cabeçalhos de HTTP.
Usando Perl:
Use CGI;
sub set_new_query() {
binmode STDOUT, ":utf8";
die if defined $query;
$query = CGI->new();
print $query->header(
-expires => 'Sat, 26 Jul 1997 05:00:00 GMT',
-Pragma => 'no-cache',
-Cache_Control => join(', ', qw(
private
no-cache
no-store
must-revalidate
max-age=0
pre-check=0
post-check=0
))
);
}
Usando o apache httpd.conf
<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>
Nota: Quando eu tentei usar o html, META, navegadores ignorou-os e armazenado em cache a página.
Eu só quero ressaltar que, se alguém quer impedir a colocação em cache APENAS de conteúdo dinâmico, adicionando os cabeçalhos adicionais devem ser feitas por meio de programação.
Eu editado o ficheiro de configuração do meu projeto para acrescentar sem cabeçalhos de cache, mas que também desativado cache de conteúdo estático, o que não é desejável.Modificar cabeçalhos de resposta no código assegura que as imagens e arquivos de estilo serão armazenados em cache.
Isto é bastante óbvio, mas mesmo assim ainda vale a pena mencionar.
E outro cuidado.Tenha cuidado ao usar ClearHeaders método de classe HttpResponse.Ele pode dar-lhe algumas contusões se você usá-lo de forma imprudente.Como ele me deu.
Após o redirecionamento no ActionFilterAttribute evento as consequências da limpeza de todos os cabeçalhos são de perder todos os dados da sessão e dados em TempData de armazenamento.É mais seguro para redirecionar a partir de uma Ação ou não limpar cabeçalhos quando o redirecionamento está ocorrendo.
No segundo pensei que eu desencorajar todos para utilizar ClearHeaders método.É melhor remover cabeçalhos separadamente.E para definir o cabeçalho de Controle de Cache corretamente, eu estou usando este código:
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Eu não tive sorte com <head><meta>
elementos.A adição de cache HTTP parâmetros relacionados diretamente (fora do HTML, doc) de fato, trabalhar para mim.
Exemplo de código em Python usando web.py web.header
chamadas seguintes.Eu deliberadamente suprimido o meu pessoais irrelevantes utilitário de código.
import web import sys import PERSONAL-UTILITIES myname = "main.py" urls = ( '/', 'main_class' ) main = web.application(urls, globals()) render = web.template.render("templates/", base="layout", cache=False) class main_class(object): def GET(self): web.header("Cache-control","no-cache, no-store, must-revalidate") web.header("Pragma", "no-cache") web.header("Expires", "0") return render.main_form() def POST(self): msg = "POSTed:" form = web.input(function = None) web.header("Cache-control","no-cache, no-store, must-revalidate") web.header("Pragma", "no-cache") web.header("Expires", "0") return render.index_laid_out(greeting = msg + form.function) if __name__ == "__main__": nargs = len(sys.argv) # Ensure that there are enough arguments after python program name if nargs != 2: LOG-AND-DIE("%s: Command line error, nargs=%s, should be 2", myname, nargs) # Make sure that the TCP port number is numeric try: tcp_port = int(sys.argv[1]) except Exception as e: LOG-AND-DIE ("%s: tcp_port = int(%s) failed (not an integer)", myname, sys.argv[1]) # All is well! JUST-LOG("%s: Running on port %d", myname, tcp_port) web.httpserver.runsimple(main.wsgifunc(), ("localhost", tcp_port)) main.run()
Veja neste link para um Estudo de Caso sobre o armazenamento em Cache:
http://securityevaluators.com/knowledge/case_studies/caching/
Resumo, de acordo com o artigo, só Cache-Control: no-store
funciona no Chrome, Firefox e IE.IE aceita outros controles, mas o Chrome e o Firefox não.O link é de uma boa leitura completa com a história de armazenamento em cache e a documentação de prova de conceito.