【网络】http 协议中 Vary 标头的作用
在 HTTP 协议中,Vary
标头是一个关键的缓存控制机制,用于告知缓存服务器(或代理):响应内容的生成依赖于请求中的哪些特定头部字段。其核心作用是确保缓存服务器能根据这些字段的差异,正确区分和返回不同版本的响应,避免缓存错乱。
一、核心作用:精准控制缓存多样性
当服务器返回一个响应时,Vary
标头会列出一组请求头部(如 Accept-Language
、Accept-Encoding
等),表示“这个响应的内容是基于这些请求头部的值生成的”。后续当缓存服务器收到新的请求时,会对比新请求中这些头部的值与缓存响应对应的头部值:
- 如果完全匹配,则可以直接返回缓存的响应;
- 如果不匹配,则需要重新向源服务器请求新的响应,避免返回错误的缓存版本。
简单来说,Vary
标头定义了“缓存的区分维度”,确保不同条件下的请求能获取到对应的正确响应。
二、典型应用场景
Vary
标头的常见使用场景与请求头部的多样性相关,例如:
1. 基于内容协商的缓存区分(最常见)
-
Vary: Accept-Encoding
:
服务器可能根据请求的Accept-Encoding
头部(如gzip
、deflate
)返回不同压缩格式的响应。Vary
标头告知缓存服务器:需根据Accept-Encoding
的值缓存不同压缩版本的响应,避免给不支持gzip
的客户端返回gzip
压缩的内容。 -
Vary: Accept-Language
:
多语言网站中,服务器可能根据Accept-Language
头部(如zh-CN
、en-US
)返回不同语言的页面。Vary
标头确保缓存服务器为不同语言请求缓存对应的版本,避免中文用户收到英文页面缓存。
2. 基于设备或客户端的差异化响应
Vary: User-Agent
:
部分服务器会根据User-Agent
头部(标识客户端设备/浏览器)返回移动端或桌面端页面。Vary
标头可让缓存服务器区分移动端和桌面端的缓存,避免手机用户收到桌面端页面。
3. 基于认证或个性化的响应
Vary: Authorization
:
对于需要认证的接口,不同用户的Authorization
令牌不同,返回的个性化内容也不同。Vary
标头确保缓存服务器为不同用户缓存各自的响应,避免信息泄露或错乱。
三、工作原理示例
假设一个多语言网站的响应头包含 Vary: Accept-Language
:
- 客户端 A 发送请求,
Accept-Language: zh-CN
,服务器返回中文页面,缓存服务器将该响应与zh-CN
关联缓存。 - 客户端 B 发送请求,
Accept-Language: en-US
,缓存服务器发现Accept-Language
与缓存的zh-CN
不匹配,于是向源服务器请求英文页面并缓存。 - 后续客户端 C 发送
Accept-Language: zh-CN
,缓存服务器直接返回之前缓存的中文页面,无需重复请求服务器。
如果没有 Vary: Accept-Language
,缓存服务器可能会错误地将中文页面返回给英文用户,导致内容错乱。
四、注意事项
- 避免过度使用:
Vary
标头中列出的头部越多,缓存的“区分维度”越细,可能导致缓存命中率下降(缓存被拆分为更多版本)。需根据实际需求选择必要的头部。 - 与缓存策略配合:
Vary
需与Cache-Control
等缓存标头配合使用,确保缓存服务器正确存储和验证响应。 - 大小写不敏感:
Vary
标头的值对大小写不敏感,但通常按规范使用大写字母(如Accept-Language
)。
总结
Vary
标头是 HTTP 缓存机制的“精准导航仪”,通过定义响应依赖的请求头部,确保缓存服务器能正确区分不同场景的响应版本,既提高缓存效率,又避免返回错误内容。在内容协商、设备适配等场景中,Vary
是保障缓存正确性的核心工具。