在同一秒内修改两次的页面是不是会中断 If-Modified-Since?

Posted

技术标签:

【中文标题】在同一秒内修改两次的页面是不是会中断 If-Modified-Since?【英文标题】:Would a page modified twice within the same second break If-Modified-Since?在同一秒内修改两次的页面是否会中断 If-Modified-Since? 【发布时间】:2021-04-12 19:22:19 【问题描述】:

根据我对缓存机制的理解,响应头Last-Modified、请求头If-Modified-Since等都精确到秒,即If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT,因此亚秒级的修改会破坏失效:

12:00:00.100 /path/to/resource updated to Version 1

12:00:00.200 GET /path/to/resource from client A
12:00:00.300 Response: Version 1 of the page with Last-Modified: 12:00:00

12:00:00.400 /path/to/resource updated to Version 2

12:00:00.500 GET /path/to/resource from client A with If-Modified-Since: 12:00:00
12:00:00.600 Response: 304 Not Modified

# and even after time passes
16:15:00.000 GET /path/to/resource from client A with If-Modified-Since: 12:00:00
16:15:00.100 Response: 304 Not Modified

在缓存过期之前,客户端永远不会获得页面的第 2 版。

真的是这样吗?存储在页面中的版本是否应该总是将页面的最后修改日期增加一秒?

【问题讨论】:

【参考方案1】:

是的,Last-Modified 的一秒分辨率意味着如果资源在不到一秒的时间内发生变化,带有If-Modified-Since 的验证请求可能会返回不适当的值。你的例子是正确的。

规范承认这一点,并在Last-Modified 标头可以被视为强验证器或弱验证器时给出rules。您可以在规范中阅读有关该区别的更多信息,但本质上它明确表示验证可能会失败(很弱),除非客户端或服务器可以确定它不会(通过比较 DateLast-Modified 标头,例如)。

不过,解决方案不是在Last-Modified 时间上撒谎,而是使用ETag 代替。它不会受到这个亚秒级分辨率问题的困扰,并且在这种情况下是 explicitly recommended 作为替代方案:

实体标签的验证比修改更可靠 不方便存储修改的情况下的日期 日期,其中 HTTP 日期值的一秒分辨率不是 足够,或者修改日期不一致 维护。

【讨论】:

以上是关于在同一秒内修改两次的页面是不是会中断 If-Modified-Since?的主要内容,如果未能解决你的问题,请参考以下文章

Fastclick 导致click事件触发两次的问题,fastclickclick

使用axios发送请求,遇到会发两次的情况

jquery的on绑定点击事件执行两次的解决办法

vue中一组件同时绑定了keyup.enter和blur事件,两个事件指向同一个函数,会触发两次的解决方案

在同一张桌子上加入两次的最佳方式是啥?

用不同的语言编译同一个文件两次的惯用方法是啥?