if-modified-since与if-none-match


88

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

Answers:


111

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

两者可以互换使用。但是,根据资源的类型及其在服务器上的生成方式,一个或另一个问题(“因为...?是否已对其进行了修改?” /“此标记是否仍与此ETag匹配?”)可能更容易回答。 。

例子:

  • 如果你的服务文件,使用文件mtimeLast-Modified日期是最简单的解决方案。
  • 如果您要提供由多个SQL查询构建的动态网页,则检查由任何这些查询返回的数据是否已更改可能是不切实际的(除非所有查询都具有某种“上次修改”列)。在这种情况下,使用页面内容的md5哈希作为ETag会容易得多。
    OTOH,这意味着即使有条件的GET,您仍然必须在服务器上生成整个页面。弄清楚ETag到底要包含什么(主键,修订号等),可以在这里节省很多时间。

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


我已经向浏览器发送了一个ETag,但是它从未使用If-None-Match请求相同的页面。可能是什么问题?
Pacerier

2
@pacerier:不需要浏览器使用Etag。因此,它可能是一个旧的浏览器,而只是忽略了它。另一种可能性是正在使用随调用而变化的url参数访问实体。如果实体名称更改,则etag将不会用于不同的请求。
拉斐尔·巴普蒂斯塔

@RafaelBaptista要详细说明下半部分,请说我有这种情况:我有一个文件服务器,并且该服务器支持使用ETags进行版本控制,并且出于向后兼容的原因,我们曾经让客户端使用查询参数my_current_version =(version )。如果我发送的my_current_version值和ETag值都不同的HTTP请求,那么在确定是提供新版本还是发回304时,将优先考虑哪种准则作为最佳实践?谢谢!
laughing_man

1
服务器如何使用Etag取决于服务器。如果希望通过重写规则,则可以将大多数文件服务器配置为忽略带有etag的参数。您对客户端-浏览器的控制较少。大多数人不会在请求另一组参数时发送他们为一组参数获得的etag标头。客户对image?v = 1的请求将不会为image?v = 2发送相同的etag。如果我要编写自己的服务器,则可以将etag实现为图像内容的哈希。这要求一个资源,并附带了我就送图像的哈希值相匹配的ETAG任何URL,我回到304
拉斐尔巴普蒂斯塔

22

If-Modified-Since与比较,Last-ModifiedIf-None-Match与比较ETag。双方Modified-SinceETag可以用来识别资源的特定变异。

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


有趣,但是为什么我要对“上次修改的”检查使用“相同的”检查?有什么好处?如果要提供文件,哪个是更好的选择?

7
对于计算机,时间很脆弱。seconds秒,在夏令时之间切换以及时钟不正确,都可能导致“最后修改”检查以返回错误结果。比较内容本身(或内容的MD5哈希)可以避免这些问题。
devdanke

尽管我完全了解@devdanke,但我要说检查时间戳比检查md5sum快得多。这些标头的目的是为了使其速度更快,有时,与向服务器加载I / O相比,最好不要将实体的新版本传输到客户端。无论如何,用户始终可以按ctrl + shift + R(或ctrl + F5或其他键)
悲伤

13

Last-Modified / If-Modified-Since中使用的时间戳记值的精度有限-一秒,这对于快速变化的内容(例如,网络聊天应用程序,其中在任意给定的秒数上可能发布多条消息)来说是远远不够的。ETag / If-None-Match可以帮助解决该问题。


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


该网址不再包含与此类似的文字。没有提及使用Last-Modifiedwith的限制ETag(或在useragent上If-Modified-Since使用If-None-Match)。同样,W3规范也不限制您。它说,不要用If-Modified-SinceIf-Match,但我认为这是因为组由ETag的定义已经更新日期,但相同的内容文件应该是相当小的。
mpag


3

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

ETag是迄今为止最灵活的。符合要求的客户端必须在条件请求中发送ETag,而应在可能的情况下都发送ETag。


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.