if-modified-since vs if-none-match

时间:2009-06-15 22:36:38

标签: http caching request response

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

7 个答案:

答案 0 :(得分:107)

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

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

示例:

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

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

答案 1 :(得分:22)

If-Modified-SinceLast-Modified进行比较,而If-None-Match则与ETag进行比较。 Modified-SinceETag都可用于标识资源的特定变体。

If-Modified-SinceLast-Modified的比较可为您提供缓存变体较旧较新的信息,而If-None-Match的比较1}}到ETag只是为您提供是否相同的信息。此外,大多数ETag生成器都包含特定于系统inode的信息,因此将文件移动到其他驱动器也可能会更改ETag

答案 2 :(得分:13)

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

答案 3 :(得分:8)

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

  

为所有可缓存资源指定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

答案 4 :(得分:5)

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

答案 5 :(得分:3)

除非服务器声明为弱,否则ETag被认为是强验证器,因此可用于满足条件范围请求。但是,大多数自动生成的ETag在服务器场情况下都存在困难,因为它们经常使用inode信息和/或唯一的持久计数器。在实践中,我发现Last Modified标头足以用于相当静态的内容,例如提供受保护的静态内容,因为文件的写入时间是一个相当好的验证器。

ETag是迄今为止最灵活的。符合条件的客户需要在条件请求中发送ETag,而如果可用,他们应该发送两者。

答案 6 :(得分:0)

If-Modified-Since标头用于指定浏览器上次接收请求的资源的时间。 If-None-Match标头用于指定服务器上次收到请求资源时所发出的实体标签。

在上述两种方式中,这些标头用于支持浏览器中内容的缓存,并使服务器能够指示浏览器使用资源的缓存副本,而不用响应资源的全部内容如果不需要的话。