Eu olhei em volta, mas ainda não consegui descobrir se devo usar um cabeçalho ETag e Expir ou um ou outro.
O que estou tentando fazer é garantir que meus arquivos flash (e outras imagens e o que não sejam atualizados apenas quando houver uma alteração nesses arquivos).
Não quero fazer nada de especial, como alterar o nome do arquivo ou colocar alguns caracteres estranhos no final do URL, para que ele não seja armazenado em cache.
Além disso, há algo que eu preciso fazer programaticamente do meu lado em meus scripts PHP para suportar isso ou é tudo Apache?
http
caching
etag
expires-header
GeoffreyF67
fonte
fonte
Respostas:
Eles são um pouco diferentes - o ETag não possui nenhuma informação que o cliente possa usar para determinar se deve ou não fazer uma solicitação para esse arquivo novamente no futuro. Se ETag é tudo o que tem, sempre será necessário fazer uma solicitação. No entanto, quando o servidor lê o ETag na solicitação do cliente, ele pode determinar se deve enviar o arquivo (HTTP 200) ou dizer ao cliente para usar apenas sua cópia local (HTTP 304). Um ETag é basicamente apenas uma soma de verificação para um arquivo que muda semanticamente quando o conteúdo do arquivo é alterado.
O cabeçalho Expira é usado pelo cliente (e proxies / caches) para determinar se ele precisa ou não fazer uma solicitação ao servidor. Quanto mais próximo você estiver da data de validade, maior a probabilidade de o cliente (ou proxy) fazer uma solicitação HTTP para esse arquivo do servidor.
Então, na verdade, o que você quer fazer é usar AMBOS cabeçalhos - defina o cabeçalho Expira para um valor razoável com base na frequência com que o conteúdo muda. Em seguida, configure ETags para serem enviados para que, quando os clientes enviarem uma solicitação ao servidor, ele possa determinar com mais facilidade se deve ou não enviar o arquivo de volta.
Uma última observação sobre o ETag - se você estiver usando uma configuração de servidor com balanceamento de carga com várias máquinas executando o Apache, provavelmente desejará desativar a geração do ETag. Isso ocorre porque os inodes são usados 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 deseje garantir que os carimbos de data e hora nos arquivos sejam exatamente iguais, para garantir que o mesmo ETag seja gerado para todos os servidores.
fonte
Etag e cabeçalhos modificados pela última vez são validadores .
Eles ajudam o navegador e / ou o cache (proxy reverso) a entender se um arquivo / página mudou, mesmo se preservar o mesmo nome.
Expira e o controle de cache está fornecendo informações de atualização .
Isso significa que eles informam, ao navegador e aos proxies inversos, até que horas ou por quanto tempo eles podem manter a página / arquivo em seu cache.
Portanto, a pergunta geralmente é qual validador usar, etag ou modificado pela última vez e qual atualizar o cabeçalho de informações a ser usado, expira ou controla o cache.
fonte
Expires
eCache-Control
são "cabeçalhos de cache fortes"Last-Modified
eETag
são "cabeçalhos de cache fracos"Primeiro, o navegador verifica
Expires/Cache-Control
para determinar se deve ou não fazer uma solicitação ao servidorSe precisar fazer uma solicitação, ela enviará
Last-Modified/ETag
a solicitação HTTP. Se oEtag
valor do documento corresponder a isso, o servidor enviará um código 304 em vez de 200 e nenhum conteúdo. O navegador carregará o conteúdo do cache.fonte
Por padrão, o Apache gera um Etag com base no número do inode do arquivo, data da última modificação e tamanho, o que deve ser perfeitamente adequado para fazer o que você deseja. Eu acho que também irá gerar, por padrão, um cabeçalho Last-Modified com base no horário da última modificação do arquivo no disco, o que também é perfeitamente adequado para fazer o que você deseja.
Você provavelmente também deve solicitar que o Apache envie um cabeçalho Expires com data de um ano no futuro (de acordo com http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) para que os navegadores saibam que o conteúdo é armazenável em cache. Dê uma olhada em mod_expires para configurar isso.
fonte
Outro resumo:
Você precisa usar os dois. ETags são informações do "servidor". Expira é um cache do "lado do cliente".
Use ETags, exceto se você tiver um servidor com balanceamento de carga. Eles são seguros e permitirão que os clientes saibam que devem obter novas versões dos arquivos do servidor sempre que alterar algo do seu lado.
A expiração deve ser usada com cautela, como se você definir uma data de vencimento no futuro, mas quiser alterar um dos arquivos imediatamente (um arquivo JS por exemplo), alguns usuários podem não ter a versão modificada por um longo tempo!
fonte
Uma coisa adicional que eu gostaria de mencionar que algumas das respostas podem ter perdido é a desvantagem de ter ambos
ETags
eExpires/Cache-control
em seus cabeçalhos.Dependendo das suas necessidades, ele pode apenas adicionar bytes extras em seus cabeçalhos, o que pode aumentar os pacotes, o que significa mais sobrecarga de TCP. Novamente, você deve ver se a sobrecarga de ter as duas coisas em seus cabeçalhos é necessária ou apenas adicionará peso extra às suas solicitações, o que reduz o desempenho.
Você pode ler mais sobre isso neste excelente post de Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/
fonte
Na minha opinião, com o Expirar cabeçalho, o servidor pode informar ao cliente quando meus dados ficam obsoletos, enquanto com o Etag, o servidor verifica o valor do etag para cada solicitação do cliente.
fonte
ETag é usado para determinar se um recurso deve usar a cópia. e Expira em Cabeçalho como o Controle de Cache é informado ao cliente que, antes das décadas do cache, o cliente deve buscar o recurso local.
Em sites modernos, geralmente há um arquivo chamado hash, como
app.98a3cf23.js
, para que seja uma boa prática usar o Expires Header. Além disso, também reduz o custo da rede.Espero que ajude ;)
fonte