本文正在参与 “网络协议必知必会”征文活动
一、Vary 解决什么问题?
浏览器 或 代理服务器
会根据 请求URL 生成 key
来建立与缓存文件的一一对应关系,这样后面相同的请求才能找到并使用缓存。
1、问题
为了应对不同设备请求(譬如电脑和手机),网站对于相同 URL 采用不同页面来响应,这会让创建缓存文件的工作陷入混乱,让手机来显示电脑版网页缓存,必然会出现错误。
2、解决方案
用 Vary 来区分,不同设备的相同URL请求,完美解决这个混乱。Vary 是在 HTTP 协议的 1.1 版本中新添加功能。详细说明,见下面 Vary: User-Agent
。
3、Vary 语法
1 | makefile复制代码Vary: * |
*
:表示不使用缓存,不推荐使用。用Cache-Control: no-store
表示不使用缓存更合适,因为这样的代码阅读更清晰明了。header-name
:表示 HTTP 头,可以有多个。
二、实际案例
1、Vary:Content-Encoding
问题说明:相同页面在 HTTP 传输过程中使用了不同压缩算法,如果不能正确区分,会造成页面打开错误。
解决方案:服务器返回 Vary:Content-Encoding
来建立跟压缩算法相关的缓存;客户端通过发送 Accept-Encoding:br
明确需要的算法类型,从而获得正确的缓存资源。
- Client1 向代理服务器请求
/doc
页面,共享缓存Cache为空,向源服务器发请求,代理服务器收到页面数据并发送给Client1,同时缓存此次页面; - Client2 向代理服务器请求
/doc
页面,代理服务器查找无对应缓存,向源服务器发请求来响应Client2,代理服务器收到页面数据并发送给Client2,同时缓存此次页面; - Client3 向代理服务器请求
/doc
页面,代理服务器查找到缓存,直接把缓存发送给Client3.
2、Vary: User-Agent
- 问题说明:
网站为了让 电脑 和 手机 都能访问,通常会有两个版本。手机先访问网站,产生了手机版缓存,之后电脑也访问了,获得了手机版缓存,这样显示页面必然会产生错误。
- 解决方案:
服务器返回 Vary: User-Agent
针对不同设备生成不同缓存。客户端请求时带上 User-Agent 头
,明确设备类型。完美解决了,过程跟上图类似,只是创建和寻找缓存的依据,换成了 User-Agent。
三、参考文档
本文转载自: 掘金