se-modificado-desde vs se-nenhuma-correspondência

88

Qual poderia ser a diferença entre if-modify-since e if-none-match? Tenho a sensação de que if-none-match é usado para arquivos, enquanto if-modify-since é usado para páginas.

Torre
fonte

Respostas:

111

Em relação às diferenças entre Last-Modified/If-Modified-Sincee ETag/If-None-Match:

Ambos podem ser usados ​​alternadamente. No entanto, dependendo do tipo de recurso e de como ele é gerado no servidor, uma ou outra pergunta ("isso foi modificado desde ...?" / "Ainda corresponde a esta ETag?") Pode ser mais fácil de responder .

Exemplos:

  • Se você estiver servindo arquivos, usar os do arquivo mtimecomo a Last-Modifieddata é a solução mais simples.
  • Se você estiver exibindo uma página da web dinâmica construída a partir de várias consultas SQL, verificar se os dados retornados por qualquer uma dessas consultas mudaram pode ser impraticável (a menos que todas tenham algum tipo de coluna de "última modificação"). Nesse caso, usar, por exemplo, um hash md5 do conteúdo da página ETagserá muito mais fácil.
    OTOH, isso significa que você ainda tem que gerar a página inteira no servidor, mesmo para um GET condicional. Descobrir o que exatamente precisa ir para a ETag (chaves primárias, números de revisão, ... etc.) pode economizar muito tempo aqui.

Veja estes links para mais detalhes sobre o assunto:

tendências
fonte
Enviei uma ETag ao navegador, mas ele nunca solicita a mesma página com If-None-Match. Qual pode ser o problema?
Pacerier
2
@pacerier: Os navegadores não precisam usar Etag. Portanto, pode ser um navegador antigo e simplesmente ignorá-lo. A outra possibilidade é que a entidade esteja sendo acessada com parâmetros de url que mudam de chamada para chamada. Se o nome da entidade mudar, etag não será usado para solicitações diferentes.
Rafael Baptista
@RafaelBaptista Para elaborar mais sobre sua segunda metade do comentário, digamos que eu tenha esta situação: eu tenho um servidor de arquivos e o servidor suporta versionamento usando ETags e por razões de compatibilidade com versões anteriores, costumávamos ter clientes usando um parâmetro de consulta my_current_version = (version ) Se eu enviar uma solicitação HTTP com valores variáveis ​​para my_current_version, mas também com ETags, qual critério, como prática recomendada, será priorizado ao determinar se devo servir uma nova versão ou devolver um 304? Obrigado!
laugh_man
1
Como o servidor usa Etag é com o servidor. Você provavelmente pode configurar a maioria dos servidores de arquivos para ignorar os parâmetros com etag se quiser via regras de reescrita. Você tem menos controle sobre o cliente - o navegador. A maioria não enviará um cabeçalho etag obtido para um conjunto de parâmetros em uma solicitação de outro. Uma solicitação do cliente para a imagem? V = 1 não enviará a mesma etag para a imagem? V = 2. Se eu estivesse escrevendo meus próprios servidores, implementaria etag como um hash do conteúdo da imagem. Qualquer url que solicite um recurso e venha com uma etag que corresponda ao hash da imagem que eu enviaria, retornarei 304.
Rafael Baptista
22

If-Modified-Sinceé comparado ao Last-Modifiedenquanto If-None-Matché comparado a ETag. Ambos Modified-Sincee ETagpodem ser usados ​​para identificar uma variante específica de um recurso.

Mas a comparação de If-Modified-Sinceto Last-Modifiedfornece a informação se a variante em cache é mais antiga ou mais recente, enquanto a comparação de If-None-Matchto ETagfornece apenas a informação se ambas são idênticas ou não. Além disso, a maioria dos ETaggeradores inclui as informações do inode específico do sistema, portanto, mover um arquivo para uma unidade diferente pode alterar o ETagtambém.

quiabo
fonte
Interessante, mas por que eu usaria verificações "idênticas" nas verificações de "última modificação"? Quais são os benefícios? Se você tem um arquivo para servir, qual é a melhor opção?
Torre de
7
Com computadores, o tempo é frágil. Segundos bissextos, alternar entre o horário de verão e relógios imprecisos, podem causar uma verificação de "última modificação" para retornar o resultado errado. Comparar o próprio conteúdo (ou hash MD5 do conteúdo) evita esses problemas.
devdanke
Apesar de eu entender perfeitamente @devdanke, eu diria que verificar o carimbo de data / hora é muito mais rápido do que verificar md5sum. O objetivo desses cabeçalhos é torná-lo rápido, às vezes é preferível não transferir a versão nova de uma entidade para o cliente do que carregar o servidor com E / S. De qualquer forma, o usuário pode sempre pressionar ctrl + shift + R (ou ctrl + F5 ou qualquer outra coisa)
Grief
13

O valor do carimbo de data / hora usado em Last-Modified / If-Modified-Since tem precisão limitada - um segundo e isso simplesmente não é suficiente para um conteúdo que muda rapidamente, como, por exemplo, um aplicativo de bate-papo na Web em que mais de uma mensagem pode ser postada a qualquer segundo . ETag / If-None-Match pode ajudar a resolver esse problema.

Alex K
fonte
9

Conforme declarado nas práticas recomendadas do Google:

É importante especificar um entre Expires ou Cache-Control max-age e um entre Last-Modified ou ETag, para todos os recursos armazenáveis ​​em cache. É redundante especificar Expires e Cache-Control: max-age ou especificar Last-Modified e ETag.

https://developers.google.com/speed/docs/best-practices/caching

Arvanite dionisíaca
fonte
esse URL não tem mais texto semelhante a esse. Nenhuma restrição contra o uso Last-Modifiedcom ETag(ou, do lado useragent, If-Modified-Sincecom If-None-Match) é mencionada. Da mesma forma, a especificação W3 não o restringe. Diz para não usar If-Modified-Sincecom If-Match, mas presumo que seja porque o conjunto de documentos com datas atualizadas, mas com o mesmo conteúdo definido pela ETag, deve ser bem pequeno.
mpag
3

A menos que declarado como fraco pelo servidor, um ETag é considerado um validador forte e, portanto, pode ser usado para satisfazer uma solicitação condicional de faixa. No entanto, a maioria das ETags geradas automaticamente apresentam dificuldades em situações de farm de servidores, pois costumam usar informações de inode e / ou um contador persistente exclusivo. Na prática, descobri que o cabeçalho Last Modified é suficiente para conteúdo razoavelmente estático, por exemplo, servir conteúdo estático protegido, uma vez que o tempo de gravação do arquivo é um validador razoavelmente bom.

A ETag é de longe a mais flexível. Os clientes em conformidade são obrigados a enviar a ETag em uma solicitação condicional, ao passo que DEVEM enviar ambas, se disponíveis.

Thomas S. Trias
fonte
0

O cabeçalho If-Modified-Since é usado para especificar a hora em que o navegador recebeu pela última vez o recurso solicitado. O cabeçalho If-None-Match é usado para especificar a tag de entidade que o servidor emitiu com o recurso solicitado quando foi recebido pela última vez.

Das duas maneiras descritas, esses cabeçalhos são usados ​​para oferecer suporte ao cache de conteúdo dentro do navegador e permitem que o servidor instrua o navegador a usar uma cópia em cache de um recurso, em vez de responder com o conteúdo completo do recurso se este for não é necessário.

Serhan M.
fonte