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



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

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

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

您可以从该规范中获取信息。根据文件,

  1. 缓存项包含请求的标头:

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

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

  1. 根据此规范,如果存在条目,则永远不会忽略缓存。即使是新的条目也可以丢弃以节省磁盘空间,而过时的时的条目。在这种情况下,缓存实体(browser/proxy/load_balancer…)向服务器发送新鲜度请求。然后,服务器决定缓存的页面是否新鲜

总之,如果根据max-age和使用的任何其他修饰符,缓存页面是fresh,则缓存实体将决定使用缓存的资源。如果它已过时,服务器将决定是否可以使用缓存的资源。

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

5.2.1.请求缓存控制指令

5.2.1.1.最大年龄

参数语法:

delta-seconds (see Section 1.2.1)

";最大年龄;request指令表示客户端
不愿意接受超过
指定秒数的响应。除非同时存在最大过时请求指令
,否则客户端不愿意接受过时的
响应。

该语言似乎表明服务器没有受到指令的强制,但它应该遵守指令。在您的示例中,这意味着客户端指令占主导地位,因为它的限制性更强。客户说";我不希望任何页面缓存超过0秒";,并且缓存服务器被假定为联系服务器以满足该条件。