Quando visito chesseng.herokuapp.com , recebo um cabeçalho de resposta que se parece com
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss
e depois atualizo a página e recebo
Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss
então parece que o cache está funcionando. Se isso funciona para armazenamento em cache, qual é o objetivo de Expira e Controle de cache: idade máxima . Para aumentar a confusão, quando testo a página em https://developers.google.com/speed/pagespeed/insights/, ele diz para "Aproveitar o cache do navegador".
http
caching
http-headers
browser-cache
cache-control
user782220
fonte
fonte
Respostas:
Para responder à sua pergunta sobre por que o cache está funcionando, mesmo que o servidor da Web não tenha incluído os cabeçalhos:
[a date]
[seconds]
O servidor solicitou aos proxies intermediários que não armazenassem em cache o conteúdo (ou seja, o item só deve ser armazenado em cache em um cache privado , ou seja, apenas em sua própria máquina local):
Mas o servidor esqueceu de incluir qualquer tipo de dicas de cache:
Mas eles incluíram uma data da última modificação na resposta:
Como o navegador sabe a data em que o arquivo foi modificado, ele pode executar uma solicitação condicional . Ele solicitará o servidor pelo arquivo, mas instruirá o servidor a enviar o arquivo somente se ele tiver sido modificado desde 16/10/2012 3:13:38:
O servidor recebe a solicitação, percebe que o cliente já possui a versão mais recente. Em vez de enviar o cliente
200 OK
, seguido pelo conteúdo da página, ele informa que sua versão em cache é boa:Seu navegador teve que sofrer o atraso de enviar uma solicitação ao servidor e aguardar uma resposta, mas economizou a necessidade de baixar novamente o conteúdo estático.
Por que Max-Age ? Por que expira ?
Porque Last-Modified é uma merda.
Nem tudo no servidor tem uma data associada. Se estou criando uma página rapidamente, não há data associada a ela - agora é . Mas estou perfeitamente disposto a deixar o usuário armazenar em cache a página inicial por 15 segundos:
Se o usuário martelar F5, ele continuará recebendo a versão em cache por 15 segundos. Se for um proxy corporativo, todos os 67198 usuários que acessarem a mesma página na mesma janela de 15 segundos obterão o mesmo conteúdo - todos servidos a partir do cache próximo. Vitória de desempenho para todos.
A virtude de adicionar
Cache-Control: max-age
é que o navegador nem precisa executar uma solicitação condicional .Last-Modified
, o navegador deve executar uma solicitaçãoIf-Modified-Since
e aguardar uma304 Not Modified
respostamax-age
, o navegador não precisará sofrer a ida e volta da rede; o conteúdo sairá diretamente dos cachesA diferença entre "Controle de cache: idade máxima" e "Expira"
Expires
é um equivalente herdado doCache-Control: max-age
cabeçalho moderno (c. 1998) :Expires
: você especifica uma data (eca)max-age
: você especifica segundos (Deus)E se ambos forem especificados, o navegador usará
max-age
:Qualquer site escrito após 1998 não deve
Expires
mais usar , e sim usarmax-age
.O que é ETag?
ETag é semelhante ao Last-Modified , exceto que ele não precisa ser uma data - apenas tem que ser algo .
Se eu estiver retirando uma lista de produtos de um banco de dados, o servidor poderá enviar o último
rowversion
como um ETag, em vez de uma data:Meu ETag pode ser o hash SHA1 de um recurso estático (por exemplo, imagem, js, css, fonte) ou da página renderizada em cache (ou seja, é isso que o wiki do Mozilla MDN faz; eles possuem a marcação final):
E exatamente como no caso de uma solicitação condicional com base na última modificação :
Eu posso executar uma solicitação condicional com base no ETag:
Um
ETag
é superior a,Last-Modified
porque funciona para coisas além de arquivos ou coisas que têm uma noção de data . Ele só éfonte
cache-control
não existir? E você só tem Etag? Ainda não é necessário fazer uma 'solicitação condicional' contra o servidor? O comportamento que estou vendo quando estou offline é que ele retorna do cache. Mas quando está offline, não pode fazer essa solicitação condicional. Então, isso significa se ele será armazenado em cache indefinidamente se você permanecer offline? Eu já fiz essa pergunta em detalhes aqui . Você pode dar uma olhada?Da seção 14.9.1 da RFC2616
fonte
Cache-Control:private
apenas porque os estados que caches compartilhados (como caches de proxy) não devem armazenar em cache a resposta.proxy-revalidate
exige que os proxies revalidem sempre em cada acesso. Onde asprivate
impede o cache do proxy.RFC 2616, seção 14.9.1 :
Os navegadores podem usar essas informações. Obviamente, o "usuário" atual pode significar muitas coisas: usuário do SO, usuário do navegador (por exemplo, perfis do Chrome) etc. Não está especificado.
Para mim, um exemplo mais concreto de
Cache-Control: private
é que servidores proxy (que normalmente têm muitos usuários) não cache-lo. É destinado ao usuário final e a mais ninguém.Para sua informação, a RFC deixa claro que isso não fornece segurança. Trata-se de mostrar o conteúdo correto, não de protegê-lo.
fonte
O campo Expirar entidade-cabeçalho fornece a data / hora após a qual a resposta é considerada obsoleta. O campo Cache-control: maxage fornece o valor da idade (em segundos) maior que a resposta considerada obsoleta.
Embora o campo acima do cabeçalho forneça um mecanismo ao cliente para decidir se deve enviar a solicitação ao servidor. Em algumas condições, o cliente envia uma solicitação para interromper e o valor da idade da resposta é maior que o valor máximo, dose significa que o servidor precisa enviar o recurso ao cliente? Talvez o recurso nunca tenha mudado.
Para resolver esse problema, o HTTP1.1 fornece o cabeçalho modificado pela última vez. O servidor fornece a data da última modificação da resposta ao cliente. Quando o cliente precisar desse recurso, ele enviará o campo de cabeçalho If-Modified-Since para o servidor. Se essa data for anterior à data de modificação do recurso, o servidor enviará o recurso ao cliente e fornecerá o código 200. Caso contrário, ele retornará o código 304 ao cliente e isso significa que o cliente pode usar o recurso em cache.
fonte