关于缓存控制 HTTP 标头的混淆

时间:2021-01-18 06:55:29

标签: javascript html http caching

我有两个关于使用 Cache-Control 标头的 HTTP 缓存的问题:

  1. 浏览器如何识别使用现有缓存可以满足哪个请求?浏览器是否检查端点是否匹配?但即使对同一端点的请求也可能有不同的 body 或配置,我不太明白浏览器如何知道何时使用缓存以及何时不使用缓存,因为它发出请求的时间是仍在响应的 max-age 标头中的 cache-control 指定的时间范围内?

  2. 我最近了解到请求和响应都可以在它们自己的 max-age 标头中设置 cache-control。我知道请求的 max-age 会告诉服务器(或任何中间缓存)客户端愿意接受他们的响应的新鲜程度。响应 max-age(或缺少响应)告诉客户端它可以认为该响应是新鲜的多长时间。 (如果我错了,请随时纠正我)。但是在这种情况下会发生什么: 假设响应的 max-age 为一年,然后我们发送另一个对相同资源的请求,max-age0。这是否会使浏览器忽略缓存?或者浏览器是否接受缓存而不发出请求?

1 个答案:

答案 0 :(得分:1)

您可以从 this specification 获取信息。根据文件,

  1. 缓存条目包含请求的标头:
<块引用>

如上所述,缓存服务器默认匹配未来 仅请求具有完全相同的标头和标头的请求 价值。

这意味着每次您向服务器发出完全相同的请求时,您的缓存中都会获得一个条目(缓存可以是个人的,也可以是共享的,就像在代理中一样)。实际上,对于只缓存 GET 请求的实体,key 可以是请求的 URI。通过normalization的过程,两个非常相似的请求可以共享一个缓存条目。使用缓存条目的决定取决于几个因素,详述如下。文件中的数字很好地解释了这一点。最重要的是,max-age 只决定了新鲜度,而不是缓存的行为。

  1. 根据此规范,如果条目存在,则永远不会忽略缓存。甚至可以丢弃 新鲜 条目以节省磁盘空间,而 陈旧 条目可以在过期后保留很长时间。不同之处在于不直接检索 stale 条目。在这种情况下,缓存实体(浏览器/代理/负载平衡器...)向服务器发送一个新鲜度请求。然后服务器决定缓存的页面是否新鲜

总而言之,如果缓存页面根据 max-age新鲜,并且使用了任何其他修饰符,则缓存实体将决定使用缓存资源。如果它是陈旧的,服务器决定是否可以使用缓存的资源。

评论后编辑: 要了解客户端和服务器发送的 max-age 之间的区别,我们需要深入研究 the http protocol。在第 5.2.1 节中,它说

<块引用>

5.2.1.请求缓存控制指令

5.2.1.1。最大年龄

参数语法:

  delta-seconds (see Section 1.2.1)

“max-age”请求指令表明客户端是
不愿意接受年龄大于
的回应 指定的秒数。除非 max-stale 请求指令
也存在,客户不愿意接受陈旧的
回复。

该语言似乎表明服务器不是由指令强制的,但预计会遵守它。在您的示例中,这意味着客户端指令占优势,因为它更具限制性。客户端说“我不希望任何页面缓存超过 0 秒”,缓存服务器应该联系服务器以满足条件。

相关问题