Pergunta

Eu olhei ao redor, mas não foram capazes de descobrir se eu deveria usar tanto uma ETag e um cabeçalho Expires ou um ou o outro.

O que eu estou tentando fazer é ter certeza de que meus arquivos flash (e outras imagens e o que não só é atualizado quando há uma mudança a esses arquivos.

Eu não quero fazer nada de especial como mudar o nome do arquivo ou colocar alguns caracteres estranhos no fim da url para torná-lo não ser armazenado em cache.

Além disso, há alguma coisa que eu preciso fazer através de programação no meu fim em meus scripts PHP para apoiar esta ou é tudo Apache?

Foi útil?

Solução

Eles são ligeiramente diferentes - é que a ETag não tem qualquer informação que o cliente pode usar para determinar se deve ou não fazer uma solicitação para esse arquivo novamente no futuro. Se ETag é tudo o que tem, ele sempre terá que fazer um pedido. No entanto, quando o servidor lê o ETag a partir da solicitação do cliente, o servidor pode, então, determinar se para enviar o arquivo (HTTP 200) ou dizer ao cliente usar apenas a sua cópia local (HTTP 304). Um ETag é basicamente apenas uma soma de verificação para um arquivo que semanticamente muda quando o conteúdo das mudanças de arquivo.

O cabeçalho Expires é usado pelo cliente (e proxies / caches) para determinar se é ou não ainda precisa fazer um pedido para o servidor em tudo. Quanto mais próximo estiver da data expirar, o mais provável é que o cliente (ou proxy) fará uma solicitação HTTP para o arquivo do servidor.

Então, realmente o que você quer fazer é usar os dois cabeçalhos - definir o cabeçalho para um valor razoável expira com base na freqüência das alterações de conteúdo. Então ETags configurar para ser enviado para que quando os clientes enviam um pedido para o servidor, ele pode mais facilmente determinar se deve ou não enviar a parte de trás do arquivo.

Uma última nota sobre ETag - se você estiver usando uma configuração de servidor com balanceamento de carga com várias máquinas rodando Apache você provavelmente vai querer desligar geração ETag. Isto é porque inodos são utilizadas como parte do algoritmo de hash ETag que será diferente entre os servidores. Você pode configurar o Apache para não usar inodes como parte do cálculo, mas depois que você gostaria de ter certeza de que a data e hora em arquivos são exatamente os mesmos, para garantir o mesmo ETag é gerada para todos os servidores.

Outras dicas

Etag e Last-Modified cabeçalhos são validadores .

Eles ajudam o navegador e / ou o cache (proxy reverso) para entender se um arquivo / página, mudou, mesmo que preserva o mesmo nome.

Expira e Cache-control está dando informações de atualização .

Isso significa que eles informam, o navegador e o inverso em entre proxies, até o tempo ou por quanto tempo, eles podem manter a página / arquivo em seu cache.

Portanto, a pergunta é geralmente que um validador para uso, etag ou última modificação, e que cabeçalho infomation de atualização para uso, expira ou cache-controle.

Expires e Cache-Control são "cabeçalhos forte cache"

Last-Modified e ETag são "cabeçalhos fraco cache"

Primeiro, o Expires/Cache-Control verificação do navegador para determinar se deve ou não fazer uma solicitação para o servidor

Se tem que fazer um pedido, ele irá enviar Last-Modified/ETag na solicitação HTTP. Se o valor Etag do documento corresponde, o servidor irá enviar um código 304 em vez de 200, e nenhum conteúdo. O navegador vai carregar o conteúdo de seu cache.

Por padrão, o Apache irá gerar um Etag baseado em o número do arquivo inode, data da última modificação e tamanho, o que deve ser perfeitamente possível fazer o que quiser. Eu acho que também irá gerar por padrão um cabeçalho Last-Modified com base no último tempo de modificação do arquivo no disco, que também é perfeitamente possível fazer o que quiser.

Você deve provavelmente também tem Apache enviar um cabeçalho Expires um ano datado no futuro (de acordo com http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) para que os navegadores conhecer o conteúdo é armazenado em cache. Ter um olhar para mod_expires para configurar isso.

Outro resumo:

Você precisa usar ambos. ETags são uma informação "do lado do servidor". Expira são um caching "do lado do cliente".

  • Use ETags , exceto se você tiver um servidor de balanceamento de carga. Eles são seguros e vai deixar os clientes sabem que eles devem obter novas versões do seu servidor de arquivos a cada vez que você mudar alguma coisa do seu lado.

  • Expira deve ser usado com cautela, como se você definir uma data de expiração longe no futuro, mas quero mudar um dos arquivos immediatelly (um arquivo JS, por exemplo), alguns usuários não pode obter a versão modificada até muito tempo!

Uma coisa adicional que eu gostaria de mencionar que algumas das respostas pode ter faltado é a desvantagem de ter tanto ETags e Expires/Cache-control em seus cabeçalhos.

Dependendo de suas necessidades só ele pode adicionar bytes extras em seus cabeçalhos que pode aumentar os pacotes que significa mais TCP sobrecarga. Mais uma vez, você deve ver se a sobrecarga de ter ambas as coisas em seus cabeçalhos é necessário ou vai apenas adicionar peso extra em seus pedidos que reduz o desempenho.

Você pode ler mais sobre isso no este excelente post por Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

A meu ver, Com expirar cabeçalho, o servidor pode dizer ao cliente quando meus dados seria obsoleto, enquanto que com Etag, servidor iria verificar o valor etag para o cliente' cada solicitação.

ETag é usado para determinar se um recurso deve usar a cópia. e Expira cabeçalho como Cache-Control é dito o cliente que antes das décadas de cache, o cliente deve buscar o recurso local.

Em locais modernos, há muitas vezes oferecem um arquivo chamado de hash, como app.98a3cf23.js, de modo que é uma boa prática para uso Expira cabeçalho. Além disso, ele também reduzir o custo da rede.

Espero que ajude;)

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