if-modified-since vs if-none-match

Tow*_*wer 88 caching http response request

if-modified-since和if-none-match之间可能有什么区别?我有一种感觉,if-none-match用于文件,而if-modified-since用于页面?

tre*_*els 109

关于之间的差异Last-Modified/If-Modified-SinceETag/If-None-Match:

两者都可以互换使用.然而,取决于资源的类型,以及它在服务器上的生成方式,一个或另一个问题("这已被修改,因为......?"/"这仍然匹配这个ETag?")可能更容易回答.

例子:

  • 如果您正在提供文件,使用该文件mtime作为Last-Modified日期是最简单的解决方案.
  • 如果您正在提供由多个SQL查询构建的动态网页,则检查这些查询返回的数据是否已更改可能是不切实际的(除非所有这些都具有某种"最后修改"列).在这种情况下,使用例如页面内容的md5哈希ETag将更容易.
    OTOH,这意味着你仍然必须在服务器上生成整个页面,即使是有条件的GET.找出究竟要进入ETag的内容(主键,修订号,......等)可以为您节省大量时间.

有关该主题的更多详细信息,请参阅以下链接

  • @pacerier:浏览器不需要使用Etag.所以它可能是一个旧的浏览器,只是忽略它.另一种可能性是使用从调用到调用的url参数访问实体.如果实体名称发生更改,那么etag将不会用于不同的请求. (2认同)

Gum*_*mbo 22

If-Modified-Since是相对于Last-ModifiedIf-None-Match进行比较ETag.双方Modified-SinceETag可以用来识别资源的特定变异.

但是的比较If-Modified-SinceLast-Modified给你的信息缓存的变种是否是旧的还是新的,而的比较If-None-MatchETag只是给你俩是否是信息相同与否.此外,大多数ETag生成器包括系统特定inode的信息,因此将文件移动到不同的驱动器也可以改变它ETag.

  • 有了电脑,时间就很脆弱.闰秒,在白天节省时间和不准确的时钟之间切换都会导致"最后修改"检查返回错误的结果.比较内容本身(或内容的MD5哈希)可以避免这些问题. (7认同)

Ale*_*x K 13

Last-Modified/If-Modified-Since中使用的时间戳值具有有限的精度 - 一秒钟,这对于快速更改的内容来说是不够的,例如,在任何给定的秒钟内可以发布多个消息的Web聊天应用程序.ETag/If-None-Match可以帮助解决这个问题.


Dio*_*tis 9

正如谷歌的最佳做法所述:

为所有可缓存资源指定Expires或Cache-Control max-age之一以及Last-Modified或ETag之一非常重要.指定Expires和Cache-Control:max-age或指定Last-Modified和ETag都是多余的.

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


Mat*_*hen 5

If-Modified-Since使用日期,而If-None-Match使用ETag.它们都可以用于"页面"(即HTML)和其他文件.