Nossas investigações nos mostraram que nem todos os navegadores respeitam as diretivas de cache HTTP de maneira uniforme.
Por razões de segurança, não queremos que determinadas páginas em nosso aplicativo sejam armazenadas em cache, sempre, pelo navegador da web. Isso deve funcionar para pelo menos os seguintes navegadores:
- Internet Explorer 6 ou superior
- Firefox 1.5 ou superior
- Safari 3+
- Opera 9+
- cromada
Nossa exigência veio de um teste de segurança. Depois de sair do nosso site, você pode pressionar o botão Voltar e visualizar as páginas em cache.
http
caching
https
http-headers
Edward Wilde
fonte
fonte
Respostas:
Introdução
O conjunto mínimo correto de cabeçalhos que funciona em todos os clientes (e proxies) mencionados:
O
Cache-Control
é pelo HTTP 1.1 especificação para clientes e proxies (e implicitamente exigido por alguns clientes ao ladoExpires
). O valorPragma
é de acordo com a especificação HTTP 1.0 para clientes pré-históricos. OExpires
é de acordo com as especificações HTTP 1.0 e 1.1 para clientes e proxies. No HTTP 1.1, aCache-Control
precedência tem precedênciaExpires
; 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á omitirCache-Control: no-cache
.Se você não se importa com os clientes IE6 e HTTP 1.0 (HTTP 1.1 foi introduzido em 1997), poderá omitir
Pragma
.Se você também não se importa com proxies HTTP 1.0, poderá omitir
Expires
.Por outro lado, se o servidor incluir automaticamente um
Date
cabeçalho válido , você também poderá omitir teoricamenteCache-Control
e confiarExpires
apenas nele .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, comomax-age
são irrelevantes, se osCache-Control
parâmetros acima mencionados forem especificados. OLast-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:
Usando Java Servlet, ou Node.js:
Usando o ASP.NET-MVC
Usando a API da Web do ASP.NET:
Usando o ASP.NET:
Usando o ASP.NET Core v3
Usando ASP:
Usando Ruby on Rails, ou Python / Flask:
Usando Python / Django:
Usando Python / Pyramid:
Usando Go:
Usando o
.htaccess
arquivo Apache :Usando HTML4:
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 umfile://
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 oshttp-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 .
fonte
(ei pessoal: não copie e cole sem pensar todos os cabeçalhos que encontrar)
Primeiro de tudo, o histórico do botão Voltar não é um cache :
Na antiga especificação HTTP, o texto era ainda mais forte, dizendo explicitamente aos navegadores que desconsiderassem as diretivas de cache para o histórico do botão voltar.
Voltar deve voltar no tempo (até o momento em que o usuário estava logado). Ele não navega para um URL aberto anteriormente.
No entanto, na prática, o cache pode influenciar o botão Voltar, em circunstâncias muito específicas:
Cache-Control: no-store, must-revalidate
(alguns navegadores observamno-store
e outros observammust-revalidate
)Você nunca precisa de:
<meta>
com cabeçalhos de cache - não funciona. Totalmente inútil.post-check
/pre-check
- é diretiva apenas para o IE que se aplica apenas a recursos capturáveis .Se você quiser, você pode adicionar:
no-cache
oumax-age=0
, o que tornará o recurso (URL) "obsoleto" e exigirá que os navegadores verifiquem com o servidor se há uma versão mais recente (no-store
já implica isso ainda mais forte).Expires
com uma data no passado para clientes HTTP / 1.0 (embora clientes reais apenas com HTTP / 1.0 não existam atualmente).Bônus: o novo RFC de cache HTTP .
fonte
Cache-Control: must-revalidate
. Por que não enviarCache-Control: no-cache
uma vez queno-cache
já implicamust-revalidate
? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1no-cache
commust-revalidate
é verdadeira para o cache, mas o histórico anterior não é um cache. Caso especial de navegadores explícitomust-revalidate
para controlar o comportamento do histórico .Como o @Kornel afirmou, o que você deseja não é desativar o cache, mas desativar o buffer do histórico. Navegadores diferentes têm suas próprias maneiras sutis de desativar o buffer do histórico.
No Chrome (v28.0.1500.95 m), podemos fazer isso apenas por
Cache-Control: no-store
.No FireFox (v23.0.1), qualquer um destes funcionará:
Cache-Control: no-store
Cache-Control: no-cache
(apenas https)Pragma: no-cache
(apenas https)Vary: *
(apenas https)No Opera (v12.15), só podemos fazer isso por
Cache-Control: must-revalidate
(somente https).No Safari (v5.1.7, 7534.57.2), qualquer um deles funcionará:
Cache-Control: no-store
<body onunload="">
em htmlCache-Control: no-store
(apenas https)No IE8 (v8.0.6001.18702IC), qualquer um deles 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
(apenas https)Vary: *
(apenas https)A combinação dos itens acima fornece a solução que funciona no Chrome 28, FireFox 23, IE8, Safari 5.1.7 e Opera 12.15:
Cache-Control: no-store, must-revalidate
(somente https)Observe que https é necessário porque o Opera não desativaria o buffer de histórico para páginas http simples. Se você realmente não pode obter https e está preparado para ignorar o Opera, o melhor que pode fazer é o seguinte:
Abaixo mostra os logs brutos 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="">
Falha: Opera 12.15
Sucesso: Chrome 28, FireFox 23, IE8, Safari 5.1.7
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="">
Falha: Opera 12.15
Sucesso: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Falha: Safari 5.1.7, Opera 12.15
Sucesso: Chrome 28, FireFox 23, IE8
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: *
Falha: Safari 5.1.7, Opera 12.15
Sucesso: Chrome 28, FireFox 23, IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
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="">
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
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="">
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
Cache-Control: no-store
Falha: Safari 5.1.7, Opera 12.15
Sucesso: Chrome 28, FireFox 23, IE8
Cache-Control: no-store
<body onunload="">
Falha: Opera 12.15
Sucesso: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: no-cache
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
Vary: *
Falha: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Sucesso: nenhum
Pragma: no-cache
Falha: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Sucesso: nenhum
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="">
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
Cache-Control: must-revalidate, max-age=0
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
Cache-Control: must-revalidate
Expires: 0
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Falha: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sucesso: IE8
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
Pragma: no-cache
Vary: *
<body onunload="">
Falha: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Sucesso: nenhum
HTTPS:
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Falha: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Sucesso: nenhum
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Falha: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Sucesso: nenhum
Vary: *
Falha: Chrome 28, Safari 5.1.7, Opera 12.15
Sucesso: FireFox 23, IE8
Pragma: no-cache
Falha: Chrome 28, Safari 5.1.7, Opera 12.15
Sucesso: FireFox 23, IE8
Cache-Control: no-cache
Falha: Chrome 28, Safari 5.1.7, Opera 12.15
Sucesso: FireFox 23, IE8
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Falha: Chrome 28, Safari 5.1.7, Opera 12.15
Sucesso: FireFox 23, IE8
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Falha: Chrome 28, Safari 5.1.7, Opera 12.15
Sucesso: FireFox 23, IE8
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: *
Falha: Chrome 28, Safari 5.1.7, Opera 12.15
Sucesso: FireFox 23, IE8
Cache-Control: must-revalidate
Falha: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Sucesso: Opera 12.15
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
<body onunload="">
Falha: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Sucesso: Opera 12.15
Cache-Control: must-revalidate, max-age=0
Falha: Chrome 28, FireFox 23, Safari 5.1.7
Sucesso: IE8, Opera 12.15
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="">
Falha: Chrome 28, Safari 5.1.7
Sucesso: FireFox 23, IE8, Opera 12.15
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falha: Chrome 28, Safari 5.1.7
Sucesso: FireFox 23, IE8, Opera 12.15
Cache-Control: no-store
Falha: Opera 12.15
Sucesso: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Falha: Opera 12.15
Sucesso: Chrome 28, FireFox 23, IE8, Safari 5.1.7
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="">
Falha: Opera 12.15
Sucesso: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Falha: Chrome 28, Safari 5.1.7, Opera 12.15
Sucesso: FireFox 23, IE8
Cache-Control: must-revalidate
Expires: 0
Falha: Chrome 28, FireFox 23, Safari 5.1.7,
Sucesso: IE8, Opera 12.15
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Falha: Chrome 28, FireFox 23, Safari 5.1.7,
Sucesso: IE8, Opera 12.15
Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Falha: Chrome 28, FireFox 23, Safari 5.1.7,
Sucesso: IE8, Opera 12.15
Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Falha: Chrome 28, FireFox 23, Safari 5.1.7,
Sucesso: IE8, Opera 12.15
Cache-Control: private, must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Falha: Chrome 28, Safari 5.1.7
Sucesso: FireFox 23, IE8, Opera 12.15
Cache-Control: no-store, must-revalidate
Falha: nenhuma
Sucesso: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
fonte
<body onunload="">
mas parece mais uma maneira de contornar o problema real. Eu tentei usar o .htaccess e modificar os cabeçalhos dessa maneira, se eu usar HTTPS, deve funcionar dessa maneira? É principalmente o safari onde o problema surge mais.Cache-Control: no-store
faria o truque.<body onunload="">
só é necessário quando você não possui HTTPS.Achei a rota web.config útil (tentei adicioná-la à resposta, mas não parece ter sido aceita, então poste aqui)
E aqui está a maneira express / node.js de fazer o mesmo:
fonte
web.conf
é: É o principal arquivo de configuração e configuração de umASP.NET
aplicativo da web. É um documento XML que reside no diretório raiz. ( wiki ).Eu descobri que todas as respostas nesta página ainda tinham problemas. Em particular, notei que nenhum deles impediria o IE8 de usar uma versão em cache da página quando você a acessasse, pressionando o botão Voltar.
Após muita pesquisa e teste, descobri que os únicos dois cabeçalhos de que realmente precisava eram:
Para obter 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 faziam com que a página fosse solicitada ao servidor quando você clica em um link para a página ou coloca o URL diretamente na barra de endereço. Isso cobre cerca de 99% de todos os navegadores em uso desde janeiro de 2010.
No IE6 e no Opera 9-10, pressionar o botão Voltar ainda fazia com que a versão em cache fosse carregada. Em todos os outros navegadores que testei, eles buscaram uma versão nova do servidor. Até agora, não encontrei nenhum conjunto de cabeçalhos que fizesse com que esses navegadores não retornassem versões em cache das páginas quando você pressionava o botão Voltar.
Atualização: Depois de escrever esta resposta, percebi que nosso servidor da web estava se identificando como um servidor HTTP 1.0. Os cabeçalhos listados são os corretos para que as respostas de um servidor HTTP 1.0 não sejam armazenadas em cache pelos navegadores. Para um servidor HTTP 1.1, veja a resposta do BalusC .
fonte
Após um pouco de pesquisa, criamos a seguinte lista de cabeçalhos que pareciam cobrir a maioria dos navegadores:
No ASP.NET, adicionamos esses itens usando o seguinte snippet:
Encontrado em: http://forums.asp.net/t/1013531.aspx
fonte
Cache-Control: no-cache
eCache-Control: private
conflito - você nunca deve reunir os dois: o primeiro diz aos navegadores e proxies para não armazenar em cache, o segundo diz aos proxies para não armazenar em cache, mas permite que os navegadores mantenham sua própria cópia privada. Não tenho certeza de qual configuração o navegador seguirá, mas é improvável que seja consistente entre navegadores e versões.O uso do cabeçalho pragma na resposta é um conto de mulheres. RFC2616 define apenas como um cabeçalho de solicitação
http://www.mnot.net/cache_docs/#PRAGMA
fonte
AVISO LEGAL: Sugiro fortemente que leia a resposta da @ BalusC. Depois de ler o seguinte tutorial sobre armazenamento em cache: http://www.mnot.net/cache_docs/ (eu recomendo que você leia também), acredito que esteja correto. No entanto, por razões históricas (e porque eu mesmo o testei), incluirei minha resposta original abaixo:
Eu tentei a resposta 'aceita' para PHP, que não funcionou para mim. Então fiz uma pequena pesquisa, encontrei uma pequena variante, testei e funcionou. Aqui está:
Isso deve funcionar. O problema era que, ao definir a mesma parte do cabeçalho duas vezes, se
false
o segundo argumento não for enviado para a função de cabeçalho, a função de cabeçalho simplesmente substituirá aheader()
chamada anterior . Portanto, ao definirCache-Control
, por exemplo, se alguém não deseja colocar todos os argumentos em umaheader()
chamada de função, deve fazer algo assim:Veja a documentação mais completa aqui .
fonte
Para o ASP.NET Core, crie uma classe simples de middleware:
então registre-o com
Startup.cs
Certifique-se de adicionar isso em algum lugar depois
fonte
Essas diretivas não atenuam nenhum risco à segurança. Eles realmente pretendem forçar os UA a atualizar informações voláteis, e não impedir que os UA retenham informações. Veja esta pergunta semelhante . No mínimo, não há garantia de que roteadores, proxies etc. também não ignorem as diretivas de cache.
Em uma nota mais positiva, as políticas relacionadas ao acesso físico a computadores, instalação de software e similares colocam você à frente da maioria das empresas em termos de segurança. Se os consumidores dessas informações são membros do público, a única coisa que você realmente pode fazer é ajudá-los a entender que, uma vez que as informações atingem sua máquina, essa máquina é de sua responsabilidade, não sua.
fonte
Há um bug no IE6
O conteúdo com "Content-Encoding: gzip" é sempre armazenado em cache, mesmo se você usar "Cache-Control: no-cache".
http://support.microsoft.com/kb/321722
Você pode desativar a compactação gzip para usuários do IE6 (verifique o agente do usuário para "MSIE 6")
fonte
O RFC para HTTP 1.1 diz que o método apropriado é adicionar um cabeçalho HTTP para:
Controle de cache: sem cache
Navegadores mais antigos podem ignorar isso se não forem adequadamente compatíveis com o HTTP 1.1. Para aqueles que você pode tentar o cabeçalho:
Pragma: sem cache
Isso também deve funcionar para navegadores HTTP 1.1.
fonte
Definir o cabeçalho http modificado para alguma data em 1995 geralmente faz o truque.
Aqui está um exemplo:
fonte
A documentação do PHP para a função de cabeçalho tem um exemplo bastante completo (contribuído por terceiros):
fonte
Se você estiver enfrentando problemas de download com o IE6-IE8 sobre SSL e cache: cabeçalho sem cache (e valores semelhantes) com arquivos do MS Office, poderá usar o cache: cabeçalho privado, sem armazenamento e retornar o arquivo mediante solicitação POST. Funciona.
fonte
no meu caso, eu resolvo o problema no chrome com esse
onde eu preciso limpar o conteúdo dos dados de um formulário do previus quando os usuários clicam no botão de volta por motivos de segurança
fonte
A resposta aceita não parece funcionar para o IIS7 +, respondendo ao grande número de perguntas sobre os cabeçalhos de cache que não foram enviados no II7:
E assim por diante
A resposta aceita está correta em que cabeçalhos devem ser definidos, mas não em como eles devem ser definidos. Dessa forma, funciona com o IIS7:
A primeira linha é definida
Cache-control
comono-cache
e a segunda linha adiciona os outros atributosno-store, must-revalidate
fonte
Response.Cache.SetAllowResponseInBrowserHistory(false); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
Eu tive resultados melhores e mais consistentes em todos os navegadores, definindo Pragma: sem cache
fonte
Os cabeçalhos da resposta fornecida pelo BalusC não impedem que o Safari 5 (e possivelmente versões mais antigas também) exibam conteúdo do cache do navegador ao usar o botão Voltar do navegador. Uma maneira de evitar isso é adicionar um atributo de manipulador de eventos onunload vazio à tag body:
Aparentemente, esse hack interrompe o cache de retorno no Safari: existe um evento de sobrecarga entre navegadores ao clicar no botão Voltar?
fonte
Além disso, apenas para uma boa medida, redefina o arquivo
ExpiresDefault
em seu.htaccess
arquivo se você estiver usando isso para ativar o cache.Depois, você pode usar
ExpiresByType
para definir valores específicos para os arquivos que deseja armazenar em cache:Isso também pode ser útil se seus arquivos dinâmicos, por exemplo, php, etc. estiverem sendo armazenados em cache pelo navegador, e você não conseguir entender o porquê. Verifique
ExpiresDefault
.fonte
Além dos cabeçalhos, considere exibir sua página via https . Muitos navegadores não armazenam em cache https por padrão.
fonte
fonte
Para concluir o BalusC -> RESPOSTA Se você estiver usando perl, poderá usar o CGI para adicionar cabeçalhos HTTP.
Usando Perl:
Usando o apache httpd.conf
Nota: Quando tentei usar o META html, os navegadores os ignoraram e armazenaram em cache a página.
fonte
Eu só quero salientar que, se alguém quiser impedir o armazenamento em cache de SOMENTE conteúdo dinâmico, a adição desses cabeçalhos adicionais deverá ser feita programaticamente.
Editei o arquivo de configuração do meu projeto para anexar cabeçalhos sem cache, mas isso também desabilitou o cache do conteúdo estático, o que geralmente não é desejável. A modificação dos cabeçalhos de resposta no código garante que as imagens e os arquivos de estilo sejam armazenados em cache.
Isso é bastante óbvio, mas ainda vale a pena mencionar.
E outra cautela. Cuidado ao usar o método ClearHeaders da classe HttpResponse. Pode causar algumas contusões se você a usar de forma imprudente. Como isso me deu.
Após o redirecionamento no evento ActionFilterAttribute, as consequências de limpar todos os cabeçalhos estão perdendo todos os dados da sessão e dados no armazenamento TempData. É mais seguro redirecionar de uma ação ou não limpar cabeçalhos quando o redirecionamento está ocorrendo.
Pensando bem, desencorajo todos a usar o método ClearHeaders. É melhor remover os cabeçalhos separadamente. E para definir o cabeçalho de controle de cache corretamente, eu estou usando este código:
fonte
Não tive sorte com
<head><meta>
elementos. A adição direta de parâmetros relacionados ao cache HTTP (fora do documento HTML) realmente funciona para mim.A seguir, exemplo de código em Python usando
web.header
chamadas web.py. Eu propositadamente editei meu código de utilidade pessoal irrelevante.fonte
Consulte este link para um estudo de caso sobre armazenamento em cache:
http://securityevaluators.com/knowledge/case_studies/caching/
Resumo, de acordo com o artigo,
Cache-Control: no-store
funciona apenas no Chrome, Firefox e IE. O IE aceita outros controles, mas o Chrome e o Firefox não. O link é uma boa leitura, completa com o histórico de armazenamento em cache e documentação de prova de conceito.fonte
Não tenho certeza se minha resposta parece simples e estúpida, e talvez ela já seja conhecida há muito tempo, mas como impedir que alguém use o botão voltar do navegador para visualizar suas páginas históricas seja um dos seus objetivos, você pode usar:
window.location.replace("https://www.example.com/page-not-to-be-viewed-in-browser-history-back-button.html");
Obviamente, isso pode não ser possível de ser implementado em todo o site, mas pelo menos para algumas páginas críticas, você pode fazer isso. Espero que isto ajude.
fonte
você pode usar o bloco de localização para definir um arquivo individual em vez de todo o aplicativo obter o cache no IIS
fonte