Pergunta

Eu tentei entender isso e procurei por perguntas semelhantes, mas ainda não tenho 100% de entendimento sobre como isso deve funcionar.

Recebo essa resposta em um pedido de recurso de imagem:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:04:04 GMT
    Expires Mon, 19 Oct 2009 09:06:05 GMT
    Cache-Control   public, max-age=120
    Etag    image_a70703fb393a60b6da346c112715a0abd54a3236
    Content-Disposition inline;filename="binary-216-420"
    Content-Type    image/jpg;charset=UTF-8
    Content-Length  4719

O comportamento desejado é que o cliente deve armazenar em cache por 120 segundos e solicite -o do servidor novamente. Dentro dos 120 segundos, nenhuma solicitação é enviada ao servidor.

Depois de 120 segundos, uma solicitação é enviada e uma resposta 304 é recebida:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:06:13 GMT

Request Headers
    Host    localhost:8080
    User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
    Accept  image/png,image/*;q=0.8,*/*;q=0.5
    Accept-Language en-us,no;q=0.8,sq;q=0.7,en;q=0.5,sv;q=0.3,nn;q=0.2
    Accept-Encoding gzip,deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive  300
    Connection  keep-alive
    Referer http://localhost:8080/cms/site/0/en/home
    Cookie  JSESSIONID=768ABBE1A3BFABE3B535900233330650; versionsCssDisplayState=block; iceInfo=iceOn:false,activePortletKey:,icePagePanelX:1722,icePagePanelY:3
    If-None-Match   image_a70703fb393a60b6da346c112715a0abd54a3236

Até agora, tudo bem. Mas então, na próxima solicitação (em 120 segundos), eu pensaria que o recurso deveria ser armazenado em cache por 120 novos segundos. O que vejo no navegador (Firefox), por outro lado, é que, a partir deste momento, sempre solicita o recurso e recebe a resposta 304.

Devo anexar os cabeçalhos de controle de cache na resposta 304? Pelo que posso ler nas especificações, parece que as configurações de controle de cache devem ser omitidas e que o cache deve armazenar em cache por 120 novos segundos automaticamente?

Foi útil?

Solução

Em teoria, você não deve enviar controle de cache para um 304-o destinatário deve continuar usando as diretivas de cache que recebeu do original 200. No entanto, como você encontrou, na prática, se não Continue enviando controle de cache, os navegadores ignoram as diretivas de cache que você enviou originalmente e reverterá para suas próprias heurísticas padrão.

Portanto, na prática, você deve incluir o mesmo controle de cache com um 304 que faria com um 200. Os mandatos apenas específicos que você o envia para um 304 se for diferente do que você enviou anteriormente (veja 10.3.5 304 não modificado) - mas certamente não o proíbe de repeti -lo quando é o mesmo.

E responder especificamente aos pontos de cabeça errada da outra resposta (estrutura):

  1. Você Faz Deseja caches intermediários para armazenar em cache a resposta (ou seja, atualize sua entrada de cache para o recurso). Eles responderão adequadamente a solicitações de clientes com 200 ou 304, dependendo de o cliente incluir um cabeçalho condicional como se modificado-uma vez.

  2. O TTL de 120 segundos vai Seja atualizado pelo 304 (para que o mesmo cliente não deve fazer outra solicitação para o mesmo recurso por pelo menos mais 120 segundos). E clientes, desde que ainda tenham o conteúdo em cache, vai Continue fazendo solicitações condicionais para o recurso, para o qual você pode continuar respondendo com um 304.

Outras dicas

RFC7232 Atualiza RFC2616 para dizer:

O servidor que gera uma resposta 304 deve gerar qualquer um dos seguintes campos de cabeçalho que teriam sido enviados em uma resposta de 200 (OK) à mesma solicitação: controle de cache, localização de conteúdo, data, ETAG, expira e variar.

Se eu entendi corretamente, o navegador está de fato em armazenamento em cache por 120 segundos e seu servidor está respondendo 304 não modificado para solicitações subsequentes de se modificou-uma vez. Essa solicitação "IMS" ocorre quando o usuário final acessa o mesmo URL. Naquela época, o navegador pode enviar uma solicitação se modificada. O navegador quer saber se está exibindo conteúdo obsoleto. Isso parece normal.

Ao receber esta solicitação, seu servidor deve responder 200 OK, 304 não modificado (ou um 4xx, se necessário).

Não acredito que você deva configurar seu servidor para enviar um cabeçalho de controle de cache com a resposta 304 por dois motivos:
1. Você não deseja que nenhum caches intermediários cache essa resposta 304 (existe a possibilidade de que eles pudessem)
2. O TTL de 120 segundos não será atualizado pela resposta 304. O navegador reterá o objeto por 120 segundos da resposta de 200 OK. Após 120 segundos, o navegador deve Envie uma solicitação GET, não um IF-modificado, pois, para que seu servidor responda com os bytes do arquivo e não apenas uma resposta 304.

Observe que o navegador não solicitará o arquivo novamente automaticamente após 120 segundos, a menos que o usuário final o solicite especificamente por meio de um carregamento de página ou inserindo diretamente a URL na barra de endereços (ou a menos que você tenha um aplicativo personalizado que controla essa funcionalidade de alguma forma).

Editou o primeiro parágrafo a ler um pouco melhor (espero)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top