Pergunta

Problema: Não consigo fazer com que o Firefox cache imagens enviadas de um servidor dinâmico

Configurar: Servidor Apache estático com proxy reverso para um servidor dinâmico (mod_perl2) no back -end.

Aqui está o URL da solicitação para o servidor. Ele é enviado ao servidor dinâmico, onde o cookie é usado para validar o acesso à imagem:

Solicitar cabeçalhos

Host:  <OBSCURED>
User-Agent:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept:  image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:  300
Connection:  keep-alive
Referer: <OBSCURED>
Cookie:  pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q
Pragma:  no-cache
Cache-Control: no-cache

O servidor dinâmico transmite a imagem de volta ao servidor e fornece a seguinte resposta:

Cabeçalhos de resposta

Date:  Tue, 24 Nov 2009 04:28:07 GMT
Server:  Apache/2.2.11 (Ubuntu) mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
Cache-Control: public, max-age=31536000
Content-Length:  25496
Content-Type:  image/jpeg
Via: 1.1 127.0.1.1:8081
Keep-Alive:  timeout=15, max=75
Connection:  Keep-Alive

Até agora, tudo bem (eu penso). No entanto, na recarga da página, a imagem não parece armazenada em cache e uma solicitação é enviada novamente:

Solicitar cabeçalhos

Host: <OBSCURED>
User-Agent:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept:  image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:  300
Connection:  keep-alive
Referer: <OBSCURED>
Cookie:  pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q
Cache-Control: max-age=0

Não parece que a solicitação deve acontecer, pois o navegador deveria ter armazenado em cache a imagem. Como é, uma resposta de 200 é recebida, a mesma que a primeira, e a imagem parece ser retirada (embora o navegador pareça estar usando as imagens em cache).

O problema parece ser sugerido pelo controle de cache: max-AGE = 0 no cabeçalho da solicitação de recarga, acima.

Alguém sabe por que isso está acontecendo? Talvez seja o Através da Cabeçalho na resposta que está causando o problema?

Foi útil?

Solução 2

Minha resposta anterior estava apenas parcialmente correta.

O problema é a maneira como o Firefox 3 lida com os eventos de recarga. Aparentemente, quase sempre solicita conteúdo novamente do servidor de origem. Assim, o Cache-Control: max-age=0 Cabeçalho de solicitação.

Raposa de fogo faz Use imagens em cache para renderizar uma página na recarga, mas ela ainda faz com que todas as solicitações para atualizá -las "em segundo plano". Em seguida, substitua -os quando eles entram.

Portanto, a página renderiza rapidamente, a YSLOW relata o conteúdo em cache. Mas o servidor ainda está sendo pregado.

A resolução é interrogar os cabeçalhos de entrada no script do servidor dinâmico e determinar se é fornecido um cabeçalho 'se modificado se modificado'. Se for esse o caso e está determinado que o conteúdo não mudou, uma resposta http_not_modified (304) será retornada.

Isso não é ideal - prefiro que o Firefox não faça as solicitações - mas reduz o tempo de carregamento da página ao meio e reduz bastante a largura de banda. Dada a maneira como o Firefox funciona na recarga, isso parece a melhor solução.

Outros comentários: O ponto de Jim Ferran sobre a navegação da página e o retorno tem mérito - o cache é sempre usado e nenhuma solicitação é extrovertida (+1 para Jim). Além disso, o conteúdo adicionado dinamicamente (por exemplo, chamadas de Ajax após a carga inicial) também parece usar o cache.

Espero que isso ajude alguém além de mim :)

Outras dicas

O pedido original tem

Cache-Control: no-cache

O que informa a todos os caches HTTP intermediários (incluindo o Firefox) que você não deseja usar uma resposta em cache, você deseja obter a resposta do próprio servidor da Web Origin.

A resposta diz:

Cache-Control: public, max-age=31536000

que diz a todos que, no que diz respeito ao servidor de origem, a resposta poderia ser armazenado em cache. O servidor parece estar configurado para permitir que a imagem PNG seja armazenada em cache: HTTP 1.1 (Seção 14.21) diz:

NOTA: Se uma resposta incluir um campo de controle de cache com a Diretiva Max-Age (consulte a Seção 14.9.3), essa diretiva substitui o campo Expire.

Seu segundo pedido diz:

Cache-Control: max-age=0

O que informa a todos os caches HTTP intermediários que você não receberá nenhuma resposta em cache com mais de 0 segundos.

Uma coisa a ser observada: se você pressionar o botão Reload no Firefox, estará pedindo para recarregar o servidor da Web Origin. Para testar o cache da imagem, navegue para longe da página e traseira ou abra -a em uma nova guia. Não sei por que você viu sem cache na primeira vez e no máximo = 0 o segundo.

BTW, eu gosto do plug-in do Firebug para o Firefox. Você pode dar uma olhada nos cabeçalhos de solicitação e resposta com ele e todos os tipos de outras coisas boas.

Parece que resolveu:

  • Removeu o proxy via cabeçalho
  • Adicionou um cabeçalho de última hora
  • Adicionado uma data de extrema expiração

O Firebug ainda mostra 200 respostas do servidor de origem, no entanto, a YSLOW reconhece as imagens como armazenadas em cache. De acordo com a YSLOW, o tamanho total do download da imagem quando o Fresh é superior a 500k; Com o cache preparado, ele mostra o tamanho do download 0k.

Aqui está o cabeçalho da resposta do servidor de origem que faz o truque:

Date: Tue, 24 Nov 2009 08:54:24 GMT
Server: Apache/2.2.11 (Ubuntu) mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
Last-Modified: Sun, 22 Nov 2009 07:28:25 GMT
Expires: Tue, 30 Nov 2010 19:00:25 GMT
Content-Length: 10883
Content-Type: image/jpeg
Keep-Alive: timeout=15, max=89
Connection: Keep-Alive

Por causa da maneira como estou solicitando as imagens, isso realmente não deve importar se essas datas são estáticas; Meu aplicativo conhece o último mod Time antes de solicitar a imagem e anexar isso ao URL da solicitação no lado do cliente para criar um URL exclusivo para cada versão da imagem, por exemplo, http://myserver.com/img/125.jpg?20091122 (A informação vem de um feed JSON do Ajax). Eu poderia, por exemplo, fazer a última data modificada em 01 de janeiro de 2000, e a data do vencimento em algum momento do ano de 2050.

Se a YSLOW estiver correta - e o teste de desempenho implica -, o Firebug deve realmente relatar esses acertos de cache local em vez de uma resposta de 200.

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