web-dev-qa-db-pt.com

Navegador Chrome não está enviando se-modificado desde o cabeçalho para o servidor

Eu tenho esses cabeçalhos sendo enviados para o cliente pelo servidor:

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 27 Nov 2011 11:10:38 GMT
ETag:"12341234"
Set-Cookie:connect.sid=e1u...7o; path=/; expires=Sun, 27 Nov 2011 11:40:38 GMT; httpOnly
Transfer-Encoding:chunked
last-modified:Sat, 26 Nov 2011 21:42:45 GMT

Eu quero que o cliente valide que o arquivo não foi alterado no servidor e envie um "200" se tiver um "304".

O Firefox envia:

if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT
if-none-match: "12341234"

Por que o chrome não envia o mesmo em uma atualização da página? Eu estou atrás do comportamento que o .Net está executando:

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate)
39
Asken

Na minha experiência, você precisa de mais do que apenas o cabeçalho de controle de cache "Privado". Você precisa do "Max-Age" ou "Expires" para forçar o Chrome a revalidar o conteúdo com o servidor. 

Lembre-se de que a revalidação só será iniciada depois que esses valores de tempo tiverem passado, portanto, talvez precisem ser configurados para um valor pequeno.

11
Andy McCluggage

Depois de passar meio dia nisso ontem, eu localizei o que estava causando o problema para mim. Contanto que você tenha o inspetor de objetos do Chrome/Depurador de Cliente/Monitor de Rede/Coisa que aparece quando você apertar F12, o Chrome não enviará cabeçalhos de solicitação de cache. Período. (atualização: nas versões mais recentes do Chrome, há uma caixa de seleção "Desativar cache"). Mesmo se você não tiver a guia "rede" aberta (ex: ter o console do javascript aberto), esta caixa de seleção ainda desabilita todo o cache.

É triste, porque depurar isso do lado do cliente obriga você a deixar o painel de rede aberto para ver quais cabeçalhos estão sendo enviados e recebidos, e quais códigos estão sendo retornados. Sem o painel de rede aberto, não há como saber se o conteúdo está sendo armazenado em cache no lado do cliente. 

Se você acessar os registros de acesso do servidor, perceberá que o servidor retornará 304s (Conteúdo em cache) no minuto em que você fechar a janela de depuração em seu cliente do Google Chrome. Espero que isto ajude. 

Chrome 24.0.1312.57

57
Mark

Eu encontrei uma resposta para esse comportamento ao usar HTTPS, pensei em compartilhar o que encontrei. Você não especifica se está solicitando via HTTP ou HTTPS.

"A regra é bem simples: qualquer erro com o certificado significa que a página não será armazenada em cache."

https://code.google.com/p/chromium/issues/detail?id=110649

Se você estiver usando um certificado autoassinado, mesmo se você informar ao Chrome para adicionar uma exceção para que a página seja carregada, nenhum recurso dessa página será armazenado em cache, e as solicitações subseqüentes não terão um cabeçalho If-Modified-Since.

29
Neek

Além disso ( https://stackoverflow.com/a/14899869/362780 ):

F12> Configurações> Geral> Desativar cache (enquanto o DevTools estiver aberto) -> desmarque esta opção ...

4
K-Gun

Os navegadores têm muito comportamento contra-intuitivo quando se trata de armazenamento em cache. Você esperaria que, se a resposta incluísse uma data da última modificação, o navegador revalidaria isso antes de reutilizá-la. Mas nenhum dos principais navegadores realmente faz isso.

As configurações ideais para sua situação dependem de quando você quer que o navegador revalide, veja o link abaixo.

Os navegadores não apenas agem de forma contrária, mas navegadores diferentes também se comportam de maneira diferente na mesma situação. Por exemplo, quando o usuário clica no botão Atualizar.

Você pode ler como os diferentes navegadores (Internet Explorer, Edge, Safari, FireFox, Chrome) se comportam com diretivas de cache diferentes (Etag, última modificação, deve-revalidar, expira, max-age, sem cache, sem-loja) em https://gertjans.home.xs4all.nl/javascript/cache-control.html

0
Gert-Jan

Eu sei que esta pergunta é antiga, mas ainda assim ... Notei que o chrome lembra a última atualização que você fez. Então, se você pressionar ctrl + shift + r (atualizando e excluindo o cache) e pressionando ctrl + r (apenas atualizando), o chrome continuará excluindo o cache e não mostrará o 304 na resposta recebida. Existe uma solução para isso. Pressione ctrl + shift + r e, em seguida, vá para a barra de endereços, concentre-a e pressione enter. Se seus etags estiverem configurados corretamente e seu servidor estiver pronto para atender um 304, você verá um novo código de resposta no depurador - 304. então funciona.

0
M K