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.

Foi útil?

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:

Chrome developer toolset HTTP traffic monitor showing HTTP response headers on stackoverflow.com

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 observar no-store e alguns observar must-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 ou max-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:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache https (apenas)

  3. Pragma: no-cache https (apenas)

  4. 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:

  1. Cache-Control: no-store
    <body onunload=""> em html

  2. Cache-Control: no-store https (apenas)

No IE8 (v8.0.6001.18702 IC) qualquer um desses vai funcionar:

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate
    Expires: 0

  5. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache https (apenas)

  7. 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:

  1. 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.7

  2. 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="">
    Falhar:Opera 12h15
    Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7

  3. Cache-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, IE8

  4. 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: *
    Falhar:O Safari 5.1.7, Opera 12h15
    Sucesso:Chrome 28, FireFox 23, IE8

  5. Cache-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:IE8

  6. 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="">
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
    Sucesso:IE8

  7. Cache-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:IE8

  8. 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="">
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
    Sucesso:IE8

  9. Cache-Control: no-store
    Falhar:O Safari 5.1.7, Opera 12h15
    Sucesso:Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Falhar:Opera 12h15
    Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
    Sucesso:IE8

  12. Vary: *
    Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12h15
    Sucesso:nenhum

  13. Pragma: no-cache
    Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12h15
    Sucesso:nenhum

  14. 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="">
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
    Sucesso:IE8

  15. Cache-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:IE8

  16. Cache-Control: must-revalidate, max-age=0
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
    Sucesso:IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
    Sucesso:IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7, Opera 12h15
    Sucesso:IE8

  19. Cache-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:

  1. 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:nenhum

  2. Cache-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:nenhum

  3. Vary: *
    Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
    Sucesso:FireFox 23, IE8

  4. Pragma: no-cache
    Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
    Sucesso:FireFox 23, IE8

  5. Cache-Control: no-cache
    Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
    Sucesso:FireFox 23, IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
    Sucesso:FireFox 23, IE8

  7. Cache-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, IE8

  8. 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: *
    Falhar:Chrome 28, Safari 5.1.7, Opera 12h15
    Sucesso:FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Sucesso:Opera 12h15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    Falhar:Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Sucesso:Opera 12h15

  11. Cache-Control: must-revalidate, max-age=0
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7
    Sucesso:IE8, Opera 12h15

  12. 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="">
    Falhar:Chrome 28, Safari 5.1.7
    Sucesso:FireFox 23, IE8, Opera 12h15

  13. Cache-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 12h15

  14. Cache-Control: no-store
    Falhar:Opera 12h15
    Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7

  15. Cache-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.7

  16. 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="">
    Falhar:Opera 12h15
    Sucesso:Chrome 28, FireFox 23, IE8, Safari 5.1.7

  17. Cache-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, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7,
    Sucesso:IE8, Opera 12h15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Falhar:Chrome 28, FireFox 23, Safari 5.1.7,
    Sucesso:IE8, Opera 12h15

  20. Cache-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 12h15

  21. Cache-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 12h15

  22. Cache-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 12h15

  23. Cache-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:

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

http://www.mnot.net/cache_docs/#PRAGMA

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:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top