首页 > 解决方案 > 关于 Cache-Control HTTP 标头的混淆

问题描述

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

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

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

标签: javascripthtmlhttpcaching

解决方案


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

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

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

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

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

总之,如果缓存页面是新鲜的,max-age并且无论使用什么其他修饰符,缓存实体都会决定使用缓存的资源。如果它是陈旧的,服务器决定是否可以使用缓存的资源。

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

5.2.1。请求缓存控制指令

5.2.1.1。最大年龄

参数语法:

  delta-seconds (see Section 1.2.1)

“max-age”请求指令表示客户端
不愿意接受年龄大于
指定秒数的响应。除非 max-stale request 指令
也存在,否则客户端不愿意接受过时的
响应。

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


推荐阅读