Qual é a diferença entre o Cache-Control: max-age = 0 e sem cache?


Respostas:


598

Eu tive a mesma pergunta e encontrei algumas informações em minhas pesquisas (sua pergunta surgiu como um dos resultados). Aqui está o que eu determinei ...

Existem dois lados no Cache-Controlcabeçalho. Um lado é para onde pode ser enviado pelo servidor da web (também conhecido como "servidor de origem"). O outro lado é para onde ele pode ser enviado pelo navegador (também conhecido como "user agent").


Quando enviado pelo servidor de origem

Eu acredito que max-age=0simplesmente informa aos caches (e agentes do usuário) que a resposta é obsoleta desde o início e, portanto, eles DEVEM revalidar a resposta (por exemplo, com o If-Not-Modifiedcabeçalho) antes de usar uma cópia em cache, ao passo que no-cachelhes diz que DEVEM revalidar antes de usar um cache. cópia de. De 14.9.1 O que é cache :

sem cache

... um cache NÃO DEVE usar a resposta para atender a uma solicitação subseqüente sem revalidação bem-sucedida com o servidor de origem. Isso permite que um servidor de origem impeça o armazenamento em cache, mesmo por caches configurados para retornar respostas obsoletas às solicitações do cliente.

Em outras palavras, os caches às vezes podem optar por usar uma resposta obsoleta (embora eu acredite que eles precisam adicionar um Warningcabeçalho), mas no-cachedizem que eles não têm permissão para usar uma resposta obsoleta, não importa o quê. Talvez você deseja que o DEVE comportamento -revalidate quando estatísticas de beisebol são gerados em uma página, mas você iria querer a MUST comportamento -revalidate quando você gerou a resposta a uma compra e-commerce.

Embora você esteja correto em seu comentário quando diz que no-cachenão deve impedir o armazenamento, pode ser outra diferença ao usá-lo no-cache. Me deparei com uma página, Diretivas de Controle de Cache Desmistificadas , que diz (não posso garantir sua correção):

Na prática, o IE e o Firefox começaram a tratar a diretiva sem cache como se instruísse o navegador a não armazenar em cache a página. Começamos a observar esse comportamento há cerca de um ano. Suspeitamos que essa alteração tenha sido motivada pelo uso generalizado (e incorreto) dessa diretiva para impedir o armazenamento em cache.

...

Observe que ultimamente, "cache-control: no-cache" também começou a se comportar como a diretiva "no-store".

Como um aparte, parece-me que Cache-Control: max-age=0, must-revalidatedeveria significar basicamente a mesma coisa que Cache-Control: no-cache. Então, talvez essa seja uma maneira de obter o comportamento de validação DEVEno-cache , evitando a migração aparente de no-cachepara fazer a mesma coisa que no-store(ou seja, sem armazenamento em cache)?


Quando enviado pelo agente do usuário

Acredito que a resposta de shahkalpesh se aplica ao lado do agente do usuário. Você também pode ver 13.2.6 Desambiguando várias respostas .

Se um agente do usuário envia uma solicitação com Cache-Control: max-age=0(também conhecida como "revalidação de ponta a ponta"), cada cache ao longo do caminho revalidará sua entrada de cache (por exemplo, com o If-Not-Modifiedcabeçalho) até o servidor de origem. Se a resposta for 304 (Não Modificado), a entidade em cache poderá ser usada.

Por outro lado, o envio de uma solicitação com Cache-Control: no-cache(também conhecido como "recarga de ponta a ponta") não revalida e o servidor NÃO DEVE usar uma cópia em cache ao responder.


9
O controle de cache não: max-age = 0, deve revalidar, revalidar proxy deve ser a equivalência exata de nenhum cache?
Didier A.

1
Ótima resposta, fui ler o artigo que você site, mas a página não é mais válida. palisade.plynt.com/issues/2008Jul/cache-control-attributes
Craig Londres

7
Obrigado, @CraigLondon. Eu o redirecionei para uma versão em cache.
Michael Krebs

2
must-revalidateNÃO pretende ser o mesmo que no-cacheou no-store. O último ignora completamente os caches, mas o primeiro apenas diz que um cache deve sempre ser verificado quanto à atualização, mas, se ainda estiver atual, poderá ser usado, economizando largura de banda. O último força downloads completos de ponta a ponta o tempo todo, ocupando largura de banda desnecessária e atrasando as respostas.
Patanjali

3
O @Patanjali no-cache não "ignora completamente os caches" nem "força downloads completos de ponta a ponta o tempo todo", pelo menos não em todos os navegadores. A especificação diz apenas que o navegador deve validar o cache.
Franklin Yu

57

idade máxima = 0

Isso equivale a clicar em Atualizar , o que significa fornecer a cópia mais recente, a menos que eu já possua a cópia mais recente.

sem cache

Isso pressiona Shift enquanto clica em Atualizar, o que significa que apenas refaça tudo, não importa o quê.


31
Isto está incorreto. shift-atualização é uma atualização forçada, que é mais parecido comno-store
Michael

3
Verificado no Firefox 45.0 que, como o Chrome 49.0.2623.87 m, também envia um "Pragma: sem cache" quando Shift + Refreshing.
Cees Timmerman

34

Pergunta antiga agora, mas se alguém encontrar isso através de uma pesquisa como eu, parece que o IE9 fará uso disso para configurar o comportamento dos recursos ao usar os botões voltar e avançar. Quando max-age = 0 é usado, o navegador usa a última versão ao visualizar um recurso em uma imprensa para trás / para frente. Se nenhum cache for usado, o recurso será recuperado.

Mais detalhes sobre o cache do IE9 podem ser vistos nesta postagem do blog em cache do msdn .


4
Da mesma forma, o IE 8 é executado em todos os tipos de problemas "não foi possível fazer o download" quando nenhum cache é usado por https. as resoluções sugeridas às vezes incluem alterar os cabeçalhos para max-age = 0
Robert Christ

28

Nos meus testes recentes com o IE8 e Firefox 3.5, parece que ambos são compatíveis com RFC. No entanto, eles diferem em sua "simpatia" com o servidor de origem. O IE8 trata as no-cacherespostas com a mesma semântica que max-age=0,must-revalidate. O Firefox 3.5, no entanto, parece tratar no-cachecomo equivalente a no-store, o que é péssimo para desempenho e uso de largura de banda.

O Squid Cache, por padrão, parece nunca armazenar nada com um no-cachecabeçalho, assim como o Firefox.

Meu conselho seria definir public,max-age=0recursos não confidenciais que você deseja verificar em cada solicitação, mas ainda permitir os benefícios de desempenho e largura de banda do armazenamento em cache. Para itens por usuário com a mesma consideração, use private,max-age=0.

Eu evitaria o uso de no-cacheinteiramente, pois parece que ele foi bastardizado por alguns navegadores e caches populares para o equivalente funcional de no-store.

Além disso, não emule Akamai e Limelight. Embora eles basicamente executem matrizes de cache em massa como seu principal negócio, e devam ser especialistas, eles realmente têm interesse em fazer com que mais dados sejam baixados de suas redes. O Google também pode não ser uma boa opção para emulação. Eles parecem usar max-age=0ou no-cachealeatoriamente, dependendo do recurso.


2
Melhor resposta para conteúdo protegido por senha. private,max-age=0.
quer

21
idade máxima
    Quando um cache intermediário é forçado, por meio de uma diretiva max-age = 0, a revalidar 
sua própria entrada de cache e o cliente forneceu seu próprio validador na solicitação, o 
O validador fornecido pode diferir do validador atualmente armazenado com a entrada de cache. 
Nesse caso, o cache PODE usar um validador para fazer seu próprio pedido sem 
afetando a transparência semântica. 

    No entanto, a escolha do validador pode afetar o desempenho. A melhor abordagem é para o
cache intermediário para usar seu próprio validador ao fazer sua solicitação. Se o servidor responder
com 304 (não modificado), o cache pode retornar sua cópia agora validada para o cliente 
com uma resposta 200 (OK). Se o servidor responder com uma nova entidade e validador de cache,
no entanto, o cache intermediário pode comparar o validador retornado com o fornecido em 
solicitação do cliente, usando a forte função de comparação. Se o validador do cliente for
igual ao servidor de origem, o cache intermediário simplesmente retorna 304 (Não 
Modificado). Caso contrário, ele retornará a nova entidade com uma resposta 200 (OK).

    Se uma solicitação incluir a diretiva sem cache, NÃO DEVE incluir min-fresh, 
max-obsoleto ou max-age. 

cortesia: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

Não aceite isso como resposta - vou ter que lê-lo para entender o verdadeiro uso dele :)


12

Não sou especialista em cache, mas Mark Nottingham é. Aqui estão os documentos de cache dele . Ele também tem excelentes links na seção Referências.

Com base na minha leitura desses documentos, parece que max-age=0poderia permitir que o cache enviasse uma resposta em cache a solicitações que chegavam no "mesmo tempo" em que "mesmo tempo" significa que, juntas o suficiente, parecem simultâneas ao cache, mas no-cachenão .


Bom ponto, mas na prática algum navegador realmente faz isso?
Pacerier

3
@Pacerier Eu acho que isso é mais para o cache de servidores proxy como Varnish, Squid, tráfego, etc.
Hank Gay

12

A propósito, vale a pena notar que alguns dispositivos móveis, particularmente produtos da Apple como iPhone / iPad, ignoram completamente cabeçalhos como no-cache, no-store, Expira em: 0 ou qualquer outra coisa que você possa tentar forçá-los a não reutilizar o prazo de validade páginas de formulário.

Isso não causou dores de cabeça ao tentarmos dizer o problema do iPad de um usuário, ficar adormecido em uma página que ele alcançou através de um processo de formulário, por exemplo, etapa 2 de 3 e, em seguida, o dispositivo ignora totalmente a loja / diretivas de cache, e até onde eu sei, simplesmente tira o que é um instantâneo virtual da página de seu último estado, ou seja, ignorando o que foi dito explicitamente e, não apenas isso, obtendo uma página que não deve ser armazenada e armazená-lo sem realmente checá-lo novamente, o que leva a todos os tipos de problemas de sessão estranhos, entre outras coisas.

Estou apenas adicionando isso no caso de alguém aparecer e não conseguir descobrir por que eles estão recebendo erros de sessão, principalmente com iphones e ipads, que parecem de longe os piores criminosos nessa área.

Eu fiz testes de depurador bastante extensos com esse problema e esta é minha conclusão: os dispositivos ignoram essas diretivas completamente.

Mesmo em uso regular, descobri que alguns celulares também falham totalmente em procurar novas versões, digamos, Expira em: 0 e depois checam as datas da última modificação para determinar se deve obter uma nova.

Isso simplesmente não acontece, então o que eu fui forçado a fazer foi adicionar strings de consulta aos arquivos css / js nos quais eu precisava forçar atualizações, o que faz com que os dispositivos móveis estúpidos pensem que é um arquivo que não possui, como: .css? v = 1 e v = 2 para uma atualização css / js. Isso funciona em grande parte.

Os navegadores de usuários também, a propósito, se deixados com os padrões, a partir de 2016, como descubro continuamente (fazemos muitas alterações e atualizações em nosso site) também não conseguem verificar as datas da última modificação desses arquivos, mas a consulta O método string corrige esse problema. Isso é algo que eu notei com clientes e pessoas do escritório que tendem a usar padrões normais básicos de usuário em seus navegadores e não têm conhecimento de problemas de cache com css / js etc. o que significa que os padrões para seus navegadores, principalmente o MSIE / Firefox, não estão fazendo o que lhes é pedido, ignoram as alterações e ignoram as datas da última modificação e não são validados, mesmo com Expires: 0 definido explicitamente.

Esse foi um bom tópico com muitas informações técnicas boas, mas também é importante observar o quão ruim é o suporte para esse material em dispositivos móveis. A cada poucos meses, tenho que adicionar mais camadas de proteção contra sua falha para seguir os comandos do cabeçalho que eles recebem ou para interceptar adequadamente esses comandos.


css e js são candidatos adequados para armazenamento em cache, como nos sistemas de produção, eles realmente não devem mudar com frequência. No entanto, armazenar em cache para eles durante o desenvolvimento é uma dor, pois essa atividade pode exigir freqüentes liberações forçadas de cache. Porém, se não for possível usar configurações diferentes para os diferentes ambientes, os requisitos de produção devem ter precedência, pois isso tem mais efeito, porque um número muito maior de acessos economizará largura de banda, em comparação com as poucas atualizações de Ctrl-F5 que alguns desenvolvedores terão façam. No entanto, a consulta de dados em tempo real requer que o controle de cache funcione corretamente.
Patanjali

0

Uma coisa que (surpreendentemente) não foi mencionada é que uma solicitação pode indicar explicitamente que aceitará dados obsoletos, usando a max-stalediretiva. Nesse caso, se o servidor respondeu max-age=0, o cache consideraria a resposta obsoleta e estaria livre para usá-la para satisfazer a solicitação do cliente [que solicitou dados potencialmente obsoletos]. Por outro lado, se o servidor envia no-cacheisso realmente supera qualquer solicitação do cliente (com max-stale) por dados antigos, como o cache DEVE revalidar.


-2

A diferença é que nenhum cache (sem armazenamento no Firefox) impede qualquer tipo de cache. Isso pode ser útil para impedir que páginas com conteúdo seguro sejam gravadas em disco e para páginas que sempre devem ser atualizadas, mesmo que sejam visitadas novamente com o botão Voltar.

max-age = 0 indica que uma entrada de cache é obsoleta e requer nova validação, mas não impede o armazenamento em cache. Geralmente, os navegadores validam os recursos apenas uma vez por sessão do navegador, portanto, o conteúdo pode não ser atualizado até que o site seja visitado em uma nova sessão.

Geralmente, os navegadores não excluem entradas de cache expiradas, a menos que estejam recuperando espaço para conteúdo mais recente quando o cache do navegador estiver cheio. Usando no-store, no-cache permite que uma entrada de cache seja excluída explicitamente.


9
Pelo que entendi, 'no-cache' NÃO deve impedir o armazenamento ('no-store' é a maneira correta de conseguir isso). Alguns navegadores interpretam 'sem cache' como 'sem armazenamento'? Isso explicaria por que 'max-age = 0' é usado em vez de simplesmente 'não-cache'
rubyruy

3
Isto está errado. Veja acima. Alguns navegadores / servidores podem optar por implementar no-cache como no-store, mas não todos.
Jeremy Kauffman

4
A única maneira segura é usar max-age=0se você quer dizer que o cache é permitido, mas o recurso deve ser revalidado e no-storese você não deseja que a resposta seja armazenada no cache. O no-cacheé aleatoriamente designado para significar qualquer um deles, dependendo do fornecedor do agente do usuário e do número da versão e protocolo de transferência.
Mikko Rantalainen 4/10/12

Quando o Firefox usa no-store?
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.