Por que os navegadores não respeitam os cabeçalhos de cache para a solicitação inicial da página?

8

Estou coçando um pouco a cabeça nisso. Um site Drupal que eu corro está configurando cabeçalhos de cache apropriados que devem indicar que a página pode ser armazenada em cache por 15 minutos. No entanto, sempre que chego à página, ela sempre envia uma solicitação GET em vez de carregar a página do cache.

Não atualizo a página com força toda vez, o que suponho que indique ao navegador que desejo liberar os caches. Não tenho nenhum bloqueio de cache no modo de desenvolvedor ativado.

Esse é apenas o comportamento padrão dos navegadores ou estou perdendo algo óbvio? Aqui estão os cabeçalhos de solicitação / resposta que acessam minha página inicial nas ferramentas de desenvolvimento do FireFox:

NOTA / EDIT : Algumas pessoas sugeriram que isso estava relacionado ao Expirescabeçalho estar no passado. No entanto, Cache-Controlsubstitui qualquer item Expires, conforme descrito na RFC 2616 , Seção 14.9.3. O Drupal inclui isso para desativar o armazenamento em cache em clientes HTTP 1.0 mais antigos, que não suportam o Varycabeçalho mais avançado que o Drupal precisa para o armazenamento em cache adequado.

insira a descrição da imagem aqui

Brian
fonte

Respostas:

11

Você tem um cabeçalho Vary: Cookie, Accept-Encoding na resposta. Isso significa que, se o proxy (incluindo o navegador) quiser armazenar esta página em cache, ele deve estar preparado para armazenar em cache uma nova versão para cada variável de cookie possivelmente modificada (ou alterações na codificação de aceitação). Especialmente, ele teria que manter um registro em primeiro lugar dos cookies, pois eles eram enviados na solicitação como um critério distintivo. Eu posso imaginar que, ou o navegador nega isso se o cookie for muito grande (e, portanto, é improvável que seja repetido), ou ele nega, para evitar que as informações sobre cookies vazem pelo conteúdo do cache ou simplesmente o conteúdo do cookie seja alterado a cada ligar.

Hagen von Eitzen
fonte
4
Estava prestes a responder minha própria pergunta quando cheguei a essa conclusão também. Eu tenho cookies do Google Analytics, um dos quais é alterado em cada solicitação de página, impedindo que a página seja armazenada em cache.
Brian
2

Nos programas CMS, algumas páginas exigem interação com o banco de dados para exibir o conteúdo dinâmico específico da solicitação dos usuários. A página inteira não pode ser armazenada em cache ou não mostraria o conteúdo correto para o usuário.

Um exemplo disso na prática é uma página de carrinho de compras / checkout de comércio eletrônico. Como a página parece diferente a cada vez, não há como armazená-la totalmente em cache. Sem saber mais sobre a página específica, é difícil saber se a página que você está referenciando requer envolvimento do banco de dados.

JMC
fonte
Embora isso seja verdade, isso não é verdade para o mecanismo de cache de páginas do Drupal (ele literalmente armazena em cache toda a saída HTML e a entrega para tráfego "anônimo") e não está realmente relacionado à minha pergunta. Minha pergunta é sobre como os navegadores parecem reagir incorretamente aos cabeçalhos de cache de página apropriados que estão definidos (veja a imagem).
Brian
Eu já vi isso antes durante a depuração, mas não me lembro, existe uma razão válida para o cabeçalho de resposta mostrar Expirar: novembro de 1978? Ou essa pode ser sua resposta.
JMC
11
No código do Drupal, o comentário acima desse cabeçalho diz: "Proxies HTTP / 1.0 não suportam o cabeçalho Vary, portanto, evite qualquer cache enviando uma data de expiração no passado. Os clientes HTTP / 1.1 ignoram o cabeçalho Expires se um Controle de cache: max-age = diretiva é especificada (consulte RFC 2616, seção 14.9.3). " A data especificamente é criadora do aniversário de Drupal.
1827 Brian
É ainda estranho que o Expira não corresponde por exemplo Last-Modified mais max-idade
Hagen von Eitzen
-1

Além das outras respostas, o Expirescabeçalho está no passado, e também por isso que os navegadores não armazenam em cache a página.

Tero Kilkanen
fonte
Isso não é verdade quando um Cache-Controlcabeçalho está presente. Ele substitui o Expirescabeçalho dos clientes HTTP 1.1. Veja ietf.org/rfc/rfc2616.txt , seção 14.9.3.
20914 Brian