javascript - 关于 Cache-Control HTTP 标头的混淆
问题描述
关于使用标头的 HTTP 缓存,我有两个问题Cache-Control
:
浏览器如何识别使用现有缓存可以满足哪个请求?浏览器是否检查端点是否匹配?但是即使对同一端点的请求也可以有不同的
body
或配置,我不太明白浏览器如何知道何时使用缓存以及何时不使用缓存,因为它发出请求的时间仍在时间范围内max-age
在响应的cache-control
标题中指定?我最近了解到请求和响应都可以
max-age
在自己的cache-control
标头中设置。我知道请求max-age
会告诉服务器(或任何中间缓存)客户端愿意从它们那里接受的响应有多新鲜。响应max-age
(或缺少响应)告诉客户它可以认为该响应是新鲜的多长时间。(如果我错了,请随时纠正我)。但是在这种情况下会发生什么:假设响应有 amax-age
for 一年,然后我们发送另一个对相同资源的请求max-age
being0
。这会让浏览器忽略缓存吗?或者浏览器是否接受缓存而不发出请求?
解决方案
您可以从该规范中获取信息。根据文件,
- 缓存条目包含请求的标头:
如上所述,缓存服务器默认情况下将仅将未来的请求匹配到具有完全相同的标头和标头值的请求。
这意味着每次向服务器发出完全相同的请求时,您都会在缓存中获得一个条目(缓存可以是个人的或共享的,就像在代理中一样)。实际上,对于只缓存 GET 请求的实体,key 可以是请求的 URI。通过 的过程 normalization
,两个非常相似的请求可以共享一个缓存条目。使用缓存条目的决定取决于几个因素,如下所述。文档中的数字很好地解释了这一点。底线,max-age
仅确定新鲜度,而不是缓存的行为。
- 根据此规范,如果条目存在,则永远不会忽略缓存。即使是新的条目也可以丢弃以节省磁盘空间,而陈旧的条目可以在过期后保留很长时间。不同之处在于不直接检索过时的条目。在这种情况下,缓存实体(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 秒”,并且缓存服务器应该联系服务器以满足条件。
推荐阅读
- sql-server - 是否可以创建额外的 sp_user_counter
- asterisk - 星号:进入队列时向呼叫者播放消息
- python - Pytorch 数学计算(只能将一个元素张量转换为 Python 标量)
- c++ - 为什么 typedef 一个类作为 C++ 中的指针
- swiftui - 将 SwiftUI ColorPicker 限制为仅在亮/暗模式下工作的颜色
- python - 导入 python 模块时出现多个错误 - ModuleNotFoundError 和 ImportError
- statistics - 从 statsmodels AutoReg 的摘要中获取值
- azure-active-directory - 验证 Microsoft Graph JWT 令牌
- python - “找不到子字符串”我做错了什么?
- android - 通过远程桌面连接 Android 智能手机