Por que essa configuração de cabeçalho HTTP faz com que os navegadores sempre executem solicitações If-Modified-Since?

2

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.

    
por peteorpeter 25.04.2013 / 00:01

1 resposta

3

Esse é o comportamento desejado especificamente para o botão de recarregamento do navegador. O botão de recarga tentará validar a página e alguns conteúdos, como o CSS.

Existem outras maneiras de carregar sua página, como navegar e voltar. Ou clique na barra de URL e clique em "entrar" nesses casos, o navegador irá com os dados em cache sem revalidar.

    
por 08.05.2013 / 08:27