Como fazer com que os cabeçalhos de cache HTTP funcionem

2

Alguém por favor pode me ajudar com uma questão de cache HTTP?

Eu pensei que se eu configurasse os cabeçalhos de solicitação "Expires" e "Cache-Control: max-age", um navegador não faria uma solicitação GET até que a max-age tivesse passado?

Meu servidor está recebendo muitas solicitações GET condicionais e responde com um 304. No entanto, eu gostaria de eliminar esses GETs condicionais, se possível, e fazer com que o navegador solicite apenas um recurso, uma vez que ele tenha expirado. / p>

Aqui estão os detalhes que recebo das ferramentas de desenvolvedor no Chrome:

Request URL:http://localhost:8080/img/branding.gif
Request Method:GET
Status Code:304 Not Modified

Solicitar cabeçalhos:

Cache-Control:max-age=0
If-Modified-Since:Thu, 22 Jul 2010 10:54:34 GMT
Referer:http://localhost:8080/
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4

Cabeçalhos de resposta:

Cache-Control:max-age=2246400, s-maxage=0
Connection:Keep-Alive
Content-Location:/img/branding.gif
Content-Type:image/gif
Date:Fri, 23 Jul 2010 15:06:10 GMT
Expires:Fri, 07 Jan 2011 15:06:10 GMT
Keep-Alive:timeout=15, max=100
Last-Modified:Thu, 22 Jul 2010 10:54:34 GMT
Pragma:cache
Server:Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)

Eu defino os cabeçalhos de cache em um filtro no meu código Java. O código está sendo executado no OC4J da Oracle.

Além disso, quero executar isso em HTTPS. O uso dos mesmos cabeçalhos também funciona para HTTPS?

Obrigado antecipadamente.

    
por A_M 26.07.2010 / 09:45

2 respostas

3

se você remover o cabeçalho Last-Modified e ETag, você eliminará totalmente as solicitações If-Modified-Since e If-None-Match e suas 304 Not Modified Responses, assim um arquivo permanecerá em cache sem verificar as atualizações até que expire. cabeçalho indica que novo conteúdo está disponível.

fonte: link

    
por 31.08.2010 / 17:18
0

I thought that if I set the "Expires" and "Cache-Control:max-age" request headers, then a browser wouldn't make a GET request until after the max-age had passed?

O problema é o que ocorre depois que max-age expirar. Então você entra em um ciclo desagradável onde o navegador solicita o conteúdo toda vez que ele vê uma referência a ele - e toda vez que o servidor responde com um 304 não modificado. Alguns navegadores perguntarão cada vez que um arquivo aparecer na mesma página! A maioria do tempo gasto para uma solicitação é para as viagens de ida e volta para o handshake TCP e depois para os cabeçalhos HTTP - portanto, isso geralmente resultará em uma página ainda mais lenta porque você (quase) forneceu os detalhes do armazenamento em cache. O efeito é ainda pior em relação ao SSL, porque isso resulta em pelo menos uma viagem de ida e volta extra para o servidor e vice-versa.

A cláusula get out na especificação é que o servidor da Web pode responder a uma solicitação condicional, fornecendo ao arquivo original novas instruções de armazenamento em cache - mas, na prática, isso pode ser bastante difícil de fazer.

Se for o apache 2.0 ou posterior, você poderá resolver o problema removendo as partes condicionais da solicitação usando mod_headers (remova as linhas if-modified-since AND as if-none-match no cabeçalho da solicitação). Para o 1.3 ou anterior, você pode contorná-lo com uma tarefa do cron que toque os arquivos a cada N dias (em que N é um pouco menor que o tempo de cache padrão).

Also, I want to run this over HTTPS. Will using the same headers work for HTTPS too?

Suponho que o exemplo que você mostrou é não-SSL. Sim, este método funcionará para o não-ssl, mas preste atenção ao navegador keep-alive (o servidor da Web que não é da Microsoft ficará emaranhado tentando falar sobre uma conexão SSL com o Keep-alive, mas melhora bastante o desempenho) .

C.

    
por 26.07.2010 / 18:37