if-modified-since 和 if-none-match 之间可能有什么区别?我有一种感觉 if-none-match 用于文件,而 if-modified-since 用于页面?
7 回答
Last-Modified/If-Modified-Since
关于和之间的区别ETag/If-None-Match
:
两者都可以互换使用。然而,根据资源的类型,以及它是如何在服务器上生成的,一个或另一个问题(“自从......以来这是否被修改过?”/“这仍然与这个 ETag 匹配吗?”)可能更容易回答.
例子:
- 如果您要提供文件,则使用文件
mtime
作为Last-Modified
日期是最简单的解决方案。 - 如果您正在提供由多个 SQL 查询构建的动态网页,那么检查这些查询中的任何一个返回的数据是否已更改可能是不切实际的(除非它们都有某种“最后修改”列)。在这种情况下,使用例如页面内容的 md5 哈希值
ETag
会容易得多。
OTOH,这意味着您仍然必须在服务器上生成整个页面,即使是有条件的 GET。弄清楚 ETag 中究竟有什么内容(主键、修订号等)可以为您节省大量时间。
有关该主题的更多详细信息,请参阅这些链接:
If-Modified-Since
与 相比较Last-Modified
而If-None-Match
与 相比较ETag
。两者均可用于识别资源的特定变体Modified-Since
。ETag
但是 to 的比较If-Modified-Since
为Last-Modified
您提供了缓存变体是旧版本还是更新版本If-None-Match
的信息,而to的比较ETag
只是为您提供了两者是否相同的信息。此外,大多数ETag
生成器是否包含系统特定inode的信息,因此将文件移动到不同的驱动器也可能会改变ETag
。
Last-Modified/If-Modified-Since 中使用的时间戳值具有有限的精度 - 1 秒,这对于快速变化的内容来说是不够的,例如,在任何给定的一秒内都可以发布多条消息的网络聊天应用程序. ETag/If-None-Match 可以帮助解决这个问题。
正如谷歌最佳实践中所述:
为所有可缓存资源指定 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
If-Modified-Since使用日期,而If-None-Match使用ETag。它们都可以用于“页面”(即 HTML)和其他文件。
除非服务器声明为弱,否则 ETag 被认为是强验证器,因此可用于满足条件范围请求。然而,大多数自动生成的 ETag 在服务器场情况下都存在困难,因为它们经常使用 inode 信息和/或唯一的持久计数器。在实践中,我发现 Last Modified 标头对于相当静态的内容已经足够了,例如提供受保护的静态内容,因为文件的写入时间是一个相当好的验证器。
ETag 是迄今为止最灵活的。符合要求的客户端需要在有条件的请求中发送 ETag,而如果可用,他们应该同时发送。
If-Modified-Since 标头用于指定浏览器上次接收请求资源的时间。If-None-Match 标头用于指定服务器在上次收到请求的资源时发出的实体标签。
在所描述的两种方式中,这些标头用于支持浏览器内的内容缓存,并且它们使服务器能够指示浏览器使用资源的缓存副本,而不是响应资源的完整内容,如果这是不必要。