在同一秒内修改两次的页面是不是会中断 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。您可以在规范中阅读有关该区别的更多信息,但本质上它明确表示验证可能会失败(很弱),除非客户端或服务器可以确定它不会(通过比较 Date
和 Last-Modified
标头,例如)。
不过,解决方案不是在Last-Modified
时间上撒谎,而是使用ETag
代替。它不会受到这个亚秒级分辨率问题的困扰,并且在这种情况下是 explicitly recommended 作为替代方案:
实体标签的验证比修改更可靠 不方便存储修改的情况下的日期 日期,其中 HTTP 日期值的一秒分辨率不是 足够,或者修改日期不一致 维护。
【讨论】:
以上是关于在同一秒内修改两次的页面是不是会中断 If-Modified-Since?的主要内容,如果未能解决你的问题,请参考以下文章
Fastclick 导致click事件触发两次的问题,fastclickclick