Por que o Apache envia 200 OK enquanto Last-modified matches If-modified-since?

10

Estou tentando ter um comportamento básico em relação à minha estratégia de armazenamento em cache: os arquivos devem ser armazenados em cache e revalidados com o servidor a cada vez. Então eu gostaria que o Apache enviasse um 304 de volta.

Aqui está a caixa de diálogo que acontece para cada atualização do navegador:

Status Code:200 OK

Request Headers

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie: ...
Host:...
If-Modified-Since:Tue, 14 Oct 2014 15:10:37 GMT
If-None-Match:"1461-505636af08fcd-gzip"
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36

Response Headers

Accept-Ranges:bytes
Cache-Control:No-cache
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1412
Content-Type:text/html
Date:Tue, 14 Oct 2014 16:58:05 GMT
ETag:"1461-505636af08fcd-gzip"
Keep-Alive:timeout=5, max=99
Last-Modified:Tue, 14 Oct 2014 15:10:37 GMT
Server:Apache/2.4.6 (Ubuntu)
Vary:Accept-Encoding

(isto é de devtools do chrome, com a opção Desativar cache desmarcada)

Você pode ver que a resposta contém o cabeçalho Cache-Control: No-cache e que o cabeçalho If-modified-since corresponde ao Last-modified. O ETag também combina.

O Apache não deveria enviar um 304 nesse caso?

EDITAR

Desativando ETags no apache com

 Header  unset ETag

torna o comportamento do cache mais previsível ...

    
por zrz 14.10.2014 / 19:19

3 respostas

7

Isso parece ser um bug antigo , explicando porque o Header unset ETag faz a diferença.

O Apache 2.4.0+ anexa automaticamente o nome do método de compactação ao ETag (como visto nos cabeçalhos) e impede uma resposta 304.

As versões mais recentes do mod_deflate suportam um DeflateAlterETag que pode ser usado para controlar esse comportamento :

DeflateAlterETag NoChange
    
por 05.06.2015 / 12:10
0

Este se destaca no pedido como sendo um pouco estranho:

Cache-Control:max-age=0

Provavelmente mais importante, percebo que o conteúdo retornado é html. Está sendo gerado dinamicamente? O Apache pode enviar uma resposta 304, mas a menos que você esteja servindo conteúdo estático, não é tarefa do Apache fazer essa chamada, e se resume à lógica do seu aplicativo. Por exemplo. a maioria dos aplicativos php tem suporte limitado para essas coisas.

Um cache front-end pode ajudar, já que o aplicativo de armazenamento em cache pode verificar a hora da modificação, etag etc., mas somente se os cabeçalhos da solicitação e do aplicativo forem compatíveis com o cache. Por exemplo, o aplicativo deve definir cabeçalhos apropriados para indicar que o conteúdo pode ser armazenado em cache, e coisas como o cabeçalho de controle de cache em sua solicitação negarão o cache. Seus cabeçalhos não estão parecendo amigáveis ao cache.

    
por 14.10.2014 / 19:36
0

Se você tiver o Apache configurado com Cache-Control:No-cache , o Apache nunca enviará um HTTP 304 Not modified para o cliente.

Se você quiser revalidar algumas solicitações, coloque um Cache-Control:No-cache somente nas páginas em que você precisa. Você não precisa revalidar todos os recursos e está desperdiçando largura de banda fazendo isso.

    
por 14.10.2014 / 19:43