Diferença entre no-cache e must-revalidate

179

Do RFC 2616

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

sem cache

Se a diretiva sem cache não especificar um nome de campo, um cache NÃO DEVE usar a resposta para atender a uma solicitação subseqüente sem uma 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.

Por isso, direciona os agentes a revalidar todas as respostas.

Comparou isso com

deve revalidar

Quando a diretiva must-revalidate está presente em uma resposta recebida por um cache, esse cache NÃO DEVE usar a entrada depois que se tornar obsoleto para responder a uma solicitação subsequente sem primeiro revalidá-lo com o servidor de origem

Por isso, direciona os agentes a revalidar respostas obsoletas .

Particularmente no-cache, é assim que os agentes de usuários tratam empiricamente essa diretiva?

Qual é o sentido de no-cachese existe must-revalidatee max-age?

Veja este comentário:

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

sem cache

Embora essa diretiva pareça instruir o navegador a não armazenar em cache a página, há uma diferença sutil. A diretiva “sem cache”, de acordo com a RFC, informa ao navegador que deve revalidar com o servidor antes de servir a página a partir do cache. A revalidação é uma técnica interessante que permite que o aplicativo economize a largura de banda. Se a página que o navegador armazenou em cache não mudou, o servidor apenas sinaliza isso para o navegador e a página é exibida no cache. Portanto, o navegador (pelo menos em teoria) armazena a página em seu cache, mas a exibe somente após a revalidação com o servidor. 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.

Alguém tem algo mais oficial sobre isso?

Atualizar

A diretiva de revalidação obrigatória deve ser usada pelos servidores se e somente se a falha na validação de uma solicitação na representação puder resultar em operação incorreta, como uma transação financeira silenciosamente não executada.

Isso é algo que nunca levei a sério até agora. O RFC está dizendo para não usar levemente revalidar levemente. O problema é que, com os serviços da Web, você precisa ter uma visão negativa e assumir o pior para seus aplicativos clientes desconhecidos. Qualquer recurso obsoleto pode causar um problema.

E outra coisa que eu considerei, sem Last-Modified ou ETags, o navegador só pode buscar todo o recurso novamente. No entanto, com ETags, observei que o Chrome pelo menos parece revalidar a cada solicitação. O que torna essas diretivas discutíveis ou, pelo menos, mal nomeadas, pois não podem revalidar adequadamente, a menos que a solicitação também inclua outros cabeçalhos que causam 'sempre revalidar' de qualquer maneira.

Eu só quero deixar esse último ponto mais claro. Ao definir, must-revalidatemas não incluir, ETag ou Last-Modified, o agente só pode obter o conteúdo novamente, pois não há nada a ser enviado ao servidor para comparação.

No entanto, meus testes empíricos mostraram que, quando ETag ou dados de cabeçalho modificados são incluídos nas respostas, os agentes sempre revalidam de qualquer maneira, independentemente da presença do must-revalidatecabeçalho.

Assim, o ponto de must-revalidateé forçar um 'esconderijo de bypass' quando ele vai obsoleto, o que só pode acontecer quando tiver definido um tempo de vida / idade, assim, se must-revalidateestiver definido em uma resposta sem idade ou outros cabeçalhos, ele efetivamente se torna equivalente a no-cacheuma vez a resposta será considerada imediatamente obsoleta.

- Então, finalmente vou marcar a resposta de Gili!

Luke Puplett
fonte
Portanto, em teoria, a diferença é validar sempre versus validar se obsoleto , enquanto na prática nenhum cache é tratado por determinados navegadores como o comentário que você citou diz como nunca validar ... então você deve escolher qual deles usar com base no que o comportamento de cache que você realmente deseja alcançar na prática ...
CBroe
Leia greenbytes.de/tech/webdav/… e veja se isso esclarece as coisas para você.
Julian Reschke
verifique esta árvore de decisão para obter respostas stackoverflow.com/a/49925190/3748498
pravdomil 19/04/18

Respostas:

191

Eu acredito que isso must-revalidatesignifica:

Depois que o cache expirar, recuse retornar respostas obsoletas ao usuário, mesmo que elas digam que respostas obsoletas são aceitáveis.

Considerando que no-cacheimplica:

must-revalidate além do fato de a resposta ficar obsoleta imediatamente.

Se uma resposta for armazenável em cache por 10 segundos, será must-revalidateativada após 10 segundos, enquanto isso no-cacheimplica must-revalidateapós 0 segundos.

Pelo menos, essa é a minha interpretação.

Gili
fonte
2
É assim que estou vendo agora. A parte interessante é o meu último parágrafo, sem um ETag ou Last-Modified, o agente não tem nada para usar para validar o que possui no cache e deve baixar toda a carga útil novamente. Portanto, quando o RFC disser "revalidar", isso provavelmente significa buscar novamente.
Luke Puplett
44
O que também significa max-age=0, must-revalidatee no-cachesão idênticos
Anshul
5
@Anshul, no começo eu pensei que você estava certo que 'max-age = 0, must-revalidate e no-cache são idênticos', mas veja a resposta de Jeffrey Fox, que parece indicar que isso não está certo.
Don escotilha
2
@Anshul Não, must-revalidatee no-cachetem um significado diferente para novas respostas: se uma resposta em cache é nova (ou seja, a resposta não expirou), must-revalidateo proxy o servirá imediatamente sem revalidar com o servidor, enquanto que com no-cacheo proxy deve revalidar o resposta em cache, independentemente da atualização. Fonte: "HTTP - O Guia Definitivo", páginas 182-183.
Matthias Braun
8
@MatthiasBraun Ah, eu posso ver a fonte da confusão. Pode ser que eu deveria ter escrito no-cachee max-age=0, must-revalidatesão idênticos
Anshul
24

max-age=0, must-revalidatee no-cachenão são exatamente idênticos. Com must-revalidate, se o servidor não responder a uma solicitação de revalidação, o navegador / proxy deve retornar um erro 504. Com no-cache, ele mostraria apenas o conteúdo em cache, que provavelmente seria preferido pelo usuário (melhor ter algo obsoleto do que nada). É por isso que must-revalidatese destina apenas a transações críticas.

Jeffrey Fox
fonte
10
Não tenho certeza sobre sua no-cacheinterpretação. Do RFC 7234 A diretiva de resposta "sem cache" indica que a resposta NÃO DEVE ser usada para satisfazer uma solicitação subsequente sem validação bem-sucedida no servidor de origem. Isso permite que um servidor de origem impeça que um cache o utilize para satisfazer uma solicitação sem entrar em contato com ele, mesmo por caches configurados para enviar respostas obsoletas. Este sons semelhantes a restrições paramust-revalidate
Anshul
9
Jeffrey tem evidências de que as implementações se comportam como ele descreveu?
OrangeDog
Eu acho que esta resposta está correta para servidores proxy / lb. Mas, de fato, os navegadores não retornam um 504 nesse caso.
Yann Dìnendal
Então must-validatemeiomust-refresh
Simon_Weaver
15

Com a interpretação de Jeffrey Fox sobre no-cache, eu testei no chrome 52.0.2743.116 m, o resultado mostra que no-cachetem o mesmo comportamento de must-revalidateque todos eles NÃO usarão o cache local quando o servidor estiver inacessível, e todos eles usarão o cache enquanto estiver tocando no navegador Voltar / Botão Avançar quando o servidor está inacessível. Como acima, acho que max-age=0, must-revalidateé idêntico no-cache, pelo menos na implementação.

Wilson Zeng
fonte
O Chrome usará o cache local quando o servidor estiver disponível para revalidar? (ou seja, "If-Modified-Since"). Em ambos os casos?
23418 Rich
-2

Eu acho que há uma diferença entre max-age=0, must-revalidatee no-cache:

No must-revalidatecaso, o cliente tem permissão para enviar uma If-Modified-Sincesolicitação e servir a resposta do cache se 304 Not Modifiedfor retornado.

No no-cachecaso, o cliente não deve armazenar em cache a resposta, portanto, não deve usá-lo If-Modified-Since.

Rico
fonte
6
Mas no-cachenão significa no-store- com no-cache, o recurso ainda pode ser armazenado em cache no cliente; só precisa ser re-validado antes de ser usado?
Aron
4
Você está em conflito no-cachee no-store. no-cachesignifica que o recurso DEVE ser revalidado . Revalidar inclui a opção de usar solicitações condicionais, como If-None-Matche If-Modified-Since.
Jules Sam. Randolph
1
@JulesRandolph: você pode estar certo. Você tem algum teste / demos? Todas as afirmações conflitantes, sem evidências, sobre este q são frustrantes. Até a resposta aceita diz apenas "Pelo menos, essa é a minha interpretação". Posso montar uma cama de teste e publicá-la aqui, se tiver algum tempo.
Ricos