HTTP协议中的Vary头,怎么用?

本文正在参与 “网络协议必知必会”征文活动


一、Vary 解决什么问题?

浏览器 或 代理服务器 会根据 请求URL 生成 key 来建立与缓存文件的一一对应关系,这样后面相同的请求才能找到并使用缓存。

1、问题

为了应对不同设备请求(譬如电脑和手机),网站对于相同 URL 采用不同页面来响应,这会让创建缓存文件的工作陷入混乱,让手机来显示电脑版网页缓存,必然会出现错误。

2、解决方案

用 Vary 来区分,不同设备的相同URL请求,完美解决这个混乱。Vary 是在 HTTP 协议的 1.1 版本中新添加功能。详细说明,见下面 Vary: User-Agent


3、Vary 语法
1
2
makefile复制代码Vary: *
Vary: <header-name>, <header-name>, ...
  • * :表示不使用缓存,不推荐使用。用 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.

HTTP-Vary


2、Vary: User-Agent
  • 问题说明:

网站为了让 电脑 和 手机 都能访问,通常会有两个版本。手机先访问网站,产生了手机版缓存,之后电脑也访问了,获得了手机版缓存,这样显示页面必然会产生错误。

  • 解决方案:

服务器返回 Vary: User-Agent 针对不同设备生成不同缓存。客户端请求时带上 User-Agent 头,明确设备类型。完美解决了,过程跟上图类似,只是创建和寻找缓存的依据,换成了 User-Agent。


三、参考文档

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%