1.前言
服务器端 Web 资源缓存的想法是在客户端和上游之间设置一个组件来缓存先前计算的结果,以避免后者过载。根据您的基础架构和要求,此组件可以是反向代理或 API 网关。HTTP 提供Cache-Control标头来自定义缓存的不同方面,例如,服务器在认为资源过时之前将其保存在缓存中的时间。我在上面的文章中使用了插件配置,但您也可以委托给Cache-Control。
关于超文本传输协议 (HTTP) 字段名称注册表项目的规范,详见链接:超文本传输协议 (HTTP) 字段名称注册表-2024-02-16更新
2.问题
想象一下以下场景。你请求一个资源,例如,GET /blog并得到如下结果:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"title": "CSDN"
}
请求成功;结果被缓存。现在,我请求相同的资源,但由于我的代码是围绕 XML 工作的,因此我将标Accept头设置为application/xml。不幸的是,服务器返回缓存的 JSON 资源,这与我要求的不同,可能会完全破坏我的代码。
问题是,缓存键默认只有一个维度,即 URL。
2.解决方案
我们需要一个可配置的多维缓存键。您现在可能已经猜到了,这就是标Vary头的作用:它明确列出缓存键的所有维度。在上面的示例中,上游将使用以下内容传达附加缓存键:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Language: en
Vary: Accept
{
"id": 1,
"title": "CSDN"
}
我们现在不再为每个 URL 设置一个缓存条目,而是为每个 MIME 类型/URL 组合设置一个缓存条目。请注意,是否使用此信息取决于缓存组件。
另一个常见的请求标头是Accept-Encoding,它通常指定客户端可以接受哪些压缩算法。编码是另一个可能的缓存键。规范允许指定多个缓存键:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Language: en
Vary: Accept, Accept-Encoding
{
"id": 1,
"title": "CSDN"
}