O cabeçalho ETag vs expira

359

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?

GeoffreyF67
fonte
11
developer.mozilla.org/pt-BR/docs/Web/HTTP/Caching (bom em geral)
Christophe Roussy

Respostas:

677

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.

Marc Novakowski
fonte
12
Você também deve verificar se deve usar o Cache-Control em vez de expirar. Meu entendimento é que o Cache-Control foi introduzido após expirar e oferece mais controle. Veja stackoverflow.com/questions/5799906/…
Luis Perez
6
Ao usar o cabeçalho Expira, é recomendável alterar o nome do arquivo sempre que um recurso for alterado, pois o cliente não solicitará o arquivo novamente antes que ele fique obsoleto. Especialmente se você estiver usando valores futuros distantes como data de validade.
Schnatterer
8
Vamos dizer que vamos usar os dois. O que acontece quando o tempo de expiração expirar, mas o arquivo não é alterado (o Etag é o mesmo)? O servidor retornará 304 e o arquivo será veiculado no cache do navegador. Minha pergunta é: será regenerado o tempo de expiração neste momento?
User345602
2
Cuidado ao definir ETAG e o cabeçalho Expira para um valor diferente de zero. Isso pode levar a condições de corrida. Veja jakearchibald.com/2016/caching-best-practices
Weston
2
É possível dizer aos servidores para não usar inodes ou timestamps? Além disso, por que eles são necessários para ETags, se usado para representar apenas conteúdo?
Cesar Castro
108

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.

John
fonte
31

Expirese Cache-Controlsão "cabeçalhos de cache fortes"

Last-Modifiede ETagsão "cabeçalhos de cache fracos"

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

Se precisar fazer uma solicitação, ela enviará Last-Modified/ETaga solicitação HTTP. Se o Etagvalor 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.

hienbt88
fonte
11
você encontra algum documento que suporte o comportamento de cache "forte e fraco"? Não consegui encontrar um, e agora o navegador do meu cliente prioriza a última modificação expirada, o que não entendo o porquê.
GMsoF 20/08/2015
11
@GMsoF Você pode dar uma olhada no seguinte: tools.ietf.org/html/rfc7232#section-2.1
Medeiros
Portanto, se eu quiser ter certeza de que minhas alterações serão propagadas imediatamente para o cliente, mas ainda beneficiarem de algum cache, só posso usar Last-Modified e ETag, certo?
Sebastien Lorber
Esta é a resposta mais concisa e, no entanto, a mais clara para mim! Obrigado.
aderchox
18

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.

David Z
fonte
Portanto, o ETag terá a última modificação e o cabeçalho expirará indicará que eu quero armazená-lo em cache e, quando carregar e sobrescrever meu arquivo, ele será puxado para o cache do usuário novamente, caso contrário, um 304 seria gerado, certo?
GeoffreyF67
O Etag depende de maneira complicada da data da última modificação; mas quando você modifica o arquivo, o Etag será alterado. O Etag enviado pelo navegador (para sua versão em cache do arquivo) não corresponderá ao Etag do arquivo no servidor e o Apache enviará o arquivo em vez de uma resposta 304.
David Z
6
O cabeçalho que expira em um ano não diz ao cliente para nem procurar uma nova versão por um ano?
John Bachir
@ John: sim, acho que estava pensando em conteúdo estático que nunca muda quando escrevi isso.
David Z
2
@ John Bachir: que deve ser o esperado, mas o navegador parece atingir de qualquer maneira o servidor, pelo menos para solicitar uma versão mais recente. Abri outra pergunta sobre esta questão: stackoverflow.com/questions/10048740/...
Marco Demaio
13

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!

Benjamin Piette
fonte
2
No caso dessa situação expirar, você basicamente precisa renomear seus js e alterá-los em seu HTML.
EralpB 8/17/17
1

Uma coisa adicional que eu gostaria de mencionar que algumas das respostas podem ter perdido é a desvantagem de ter ambos ETagse Expires/Cache-controlem 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/

aneagoie
fonte
1

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.

Ensolarado
fonte
0

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 ;)

Jack Chen
fonte