0

根据我对缓存机制的理解,响应头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。

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

4

1 回答 1

1

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

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

但是,解决方案不是谎报Last-Modified时间,而是使用 anETag代替。它不会受到这个亚秒级分辨率问题的影响,并且在这种情况下被明确推荐作为替代方案:

在不方便存储修改日期、HTTP 日期值的一秒分辨率不足或修改日期未始终如一地维护的情况下,实体标签的验证比修改日期更可靠。

于 2021-01-07T14:20:44.717 回答