Em nosso servidor, configuramos os cabeçalhos de resposta HTTP da seguinte forma:
Cache-Control:max-age=28800, must-revalidate # (8 hours)
Connection:Keep-Alive
Date:Wed, 24 Apr 2013 21:36:19 GMT
ETag:W/"173520-1366833451000"
Expires:Thu, 25 Apr 2013 05:36:19 GMT # (8 hours from access)
Keep-Alive:timeout=15, max=484
Server:Apache-Coyote/1.1
Vary:Accept-Encoding,User-Agent
Nossa intenção era que o recurso fosse armazenado em cache pelo navegador por oito horas, após as quais o navegador deveria verificar se havia sido modificado (com uma solicitação 304
) antes de usar a cópia em cache.
No entanto, descobri que o navegador sempre gera 304
. (Ele continua a usar sua cópia em cache, mas verifica as modificações no servidor antes de fazê-lo - o que eu quero que ocorra após 8 horas, não o tempo todo).
Como achei que deveria funcionar, Cache-Control:max-age=28800, must-revalidate
deve instruir o cliente a usar o recurso em cache até atingir max-age
no cache, após o qual must-revalidate
com o servidor de origem. Acredito que a diretiva Expires
é mais um substituto e que Cache-Control
substitui is - mas se estava em jogo, eu esperaria que o navegador usasse a cópia em cache até a data de expiração, então busque uma nova cópia. A maior parte é obtida de artigo escrito , e lendo um pouco a especificação.
Obviamente, meu entendimento é incompleto - o que estou perdendo?
EDITAR: Eu assumi erroneamente que, ao atualizar a página atual, eu estaria testando o que acontece quando o navegador acessa páginas subseqüentes que têm os mesmos recursos vinculados. Eu estava errado - apertar o botão "atualizar" geralmente parece forçar o navegador a verificar se algum dos recursos foram modificados antes de usar as cópias em cache, o que faz um sentido insano óbvio . Quando clico para outras páginas, os recursos são extraídos diretamente do cache, conforme o esperado.