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.
Respostas:
Em relação às diferenças entre Last-Modified/If-Modified-Since
e 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:
mtime
como a Last-Modified
data é a solução mais simples.ETag
será muito mais fácil. Veja estes links para mais detalhes sobre o assunto:
If-Modified-Since
é comparado ao Last-Modified
enquanto If-None-Match
é comparado a ETag
. Ambos Modified-Since
e ETag
podem ser usados para identificar uma variante específica de um recurso.
Mas a comparação de If-Modified-Since
to Last-Modified
fornece a informação se a variante em cache é mais antiga ou mais recente, enquanto a comparação de If-None-Match
to ETag
fornece apenas a informação se ambas são idênticas ou não. Além disso, a maioria dos ETag
geradores inclui as informações do inode específico do sistema, portanto, mover um arquivo para uma unidade diferente pode alterar o ETag
também.
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.
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
Last-Modified
com ETag
(ou, do lado useragent, If-Modified-Since
com If-None-Match
) é mencionada. Da mesma forma, a especificação W3 não o restringe. Diz para não usar If-Modified-Since
com 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.
If-Modified-Since usa uma data, enquanto If-None-Match usa uma ETag . Ambos podem ser usados para "páginas" (ou seja, HTML) e outros arquivos.
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.
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.