我有两个关于使用 Cache-Control
标头的 HTTP 缓存的问题:
浏览器如何识别使用现有缓存可以满足哪个请求?浏览器是否检查端点是否匹配?但即使对同一端点的请求也可能有不同的 body
或配置,我不太明白浏览器如何知道何时使用缓存以及何时不使用缓存,因为它发出请求的时间是仍在响应的 max-age
标头中的 cache-control
指定的时间范围内?
我最近了解到请求和响应都可以在它们自己的 max-age
标头中设置 cache-control
。我知道请求的 max-age
会告诉服务器(或任何中间缓存)客户端愿意接受他们的响应的新鲜程度。响应 max-age
(或缺少响应)告诉客户端它可以认为该响应是新鲜的多长时间。 (如果我错了,请随时纠正我)。但是在这种情况下会发生什么:
假设响应的 max-age
为一年,然后我们发送另一个对相同资源的请求,max-age
为 0
。这是否会使浏览器忽略缓存?或者浏览器是否接受缓存而不发出请求?
答案 0 :(得分:1)
您可以从 this specification 获取信息。根据文件,
如上所述,缓存服务器默认匹配未来 仅请求具有完全相同的标头和标头的请求 价值。
这意味着每次您向服务器发出完全相同的请求时,您的缓存中都会获得一个条目(缓存可以是个人的,也可以是共享的,就像在代理中一样)。实际上,对于只缓存 GET 请求的实体,key 可以是请求的 URI。通过normalization
的过程,两个非常相似的请求可以共享一个缓存条目。使用缓存条目的决定取决于几个因素,详述如下。文件中的数字很好地解释了这一点。最重要的是,max-age
只决定了新鲜度,而不是缓存的行为。
总而言之,如果缓存页面根据 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 秒”,缓存服务器应该联系服务器以满足条件。