【发布时间】:2023-03-31 03:40:02
【问题描述】:
if-modified-since 和 if-none-match 之间有什么区别?我有一种感觉,if-none-match 用于文件,而 if-modified-since 用于页面?
【问题讨论】:
标签: http caching request response
if-modified-since 和 if-none-match 之间有什么区别?我有一种感觉,if-none-match 用于文件,而 if-modified-since 用于页面?
【问题讨论】:
标签: http caching request response
关于Last-Modified/If-Modified-Since和ETag/If-None-Match的区别:
两者可以互换使用。然而,根据资源的类型,以及它是如何在服务器上生成的,一个或另一个问题(“自从......以来这是否被修改过?”/“这仍然与这个 ETag 匹配吗?”)可能更容易回答.
例子:
mtime 作为Last-Modified 日期是最简单的解决方案。ETag 会容易得多。有关该主题的更多详细信息,请参阅以下链接:
【讨论】:
If-Modified-Since 与Last-Modified 进行比较,而If-None-Match 与ETag 进行比较。 Modified-Since 和 ETag 都可用于识别资源的特定变体。
但是If-Modified-Since 与Last-Modified 的比较可以为您提供缓存变体是旧 还是新 的信息,而If-None-Match 与@987654335 的比较@ 只是为您提供两者是否相同的信息。此外,大多数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
【讨论】:
Last-Modified 和ETag(或者,在用户代理端,If-Modified-Since 和If-None-Match)没有任何限制。同样,W3 规范不会限制您。它说不要将If-Modified-Since 与If-Match 一起使用,但我认为这是因为具有更新日期但与ETag 定义的内容相同的文档集应该很小。
If-Modified-Since 使用日期,而If-None-Match 使用ETag。它们都可以用于“页面”(即 HTML)和其他文件。
【讨论】:
除非服务器声明为弱,否则 ETag 被视为强验证器,因此可用于满足条件范围请求。然而,大多数自动生成的 ETag 在服务器场情况下会出现困难,因为它们经常使用 inode 信息和/或唯一的持久计数器。在实践中,我发现 Last Modified 标头足以容纳相当静态的内容,例如提供受保护的静态内容,因为文件的写入时间是一个相当好的验证器。
ETag 是迄今为止最灵活的。符合要求的客户端需要在有条件的请求中发送 ETag,而如果可用,他们应该同时发送。
【讨论】:
If-Modified-Since 标头用于指定浏览器上次接收请求资源的时间。 If-None-Match 标头用于指定服务器在上次收到请求的资源时发布的实体标签。
在所描述的两种方式中,这些标头用于支持浏览器内的内容缓存,它们使服务器能够指示浏览器使用资源的缓存副本,而不是响应资源的全部内容如果这不是必需的。
【讨论】: