浏览器缓存中怎么利用Vary请求头根据客户端不同的User-Agent或Accept-Encoding返回并缓存不同的代码产物

星磊酱_9037

星磊酱_9037

2026-07-21

417人浏览

原创

浏览器缓存不主动根据user-agent或accept-encoding返回不同产物,而是由服务器通过vary响应头声明缓存键维度,配合真实差异化响应实现缓存区分;vary: accept-encoding使gzip与br版本独立缓存,vary: user-agent易致缓存碎片化,需后端真实适配并标准化ua以避免无效分裂。

浏览器缓存中怎么利用vary请求头根据客户端不同的user-agent或accept-encoding返回并缓存不同的代码产物

浏览器缓存本身不主动“根据 User-Agent 或 Accept-Encoding 返回不同产物”,它只负责存储和复用响应。真正实现差异化返回与缓存区分的,是服务器(如 Nginx、CDN 或应用后端)配合 Vary 响应头协同完成的——Vary 是告诉缓存系统:“这个响应是否可用,取决于请求里这些头字段的值是否匹配”。

理解 Vary 的作用机制

Vary 不是让浏览器“动态生成内容”,而是声明缓存键(cache key)的构成维度:

  • 当响应头包含 Vary: Accept-Encoding,缓存会把 Accept-Encoding 的实际值(如 gzip、br、空)纳入缓存标识。同一 URL,gzip 版本和 br 版本会被存为两个独立缓存项。
  • 当响应头包含 Vary: User-Agent,缓存会按 UA 字符串做区分。但 UA 取值高度离散(如含版本号、设备标识),极易导致缓存碎片化,命中率骤降。
  • 缓存(包括浏览器、CDN、Nginx proxy_cache)在收到新请求时,先提取请求中的对应头字段值,再查找“完全匹配该值”的缓存项;不匹配则回源。

服务端如何配合生成差异产物

仅设 Vary 不够,后端必须真实依据请求头返回不同内容:

page-agent 浏览器控制(CDP)
page-agent 浏览器控制(CDP)

使用 page-agent CLI(CDP)控制浏览器;CLI只能通过 GitHub Release 的 .tgz 安装,npm 官方包暂未发布。

下载
  • Accept-Encoding:Web 服务器(如 Nginx)需启用压缩模块,并根据客户端请求的 Accept-Encoding 自动选择 gzip / brotli / 不压缩;后端应用若自行压缩,也需读取该头并输出对应 Content-Encoding 和正文。
  • User-Agent:需业务逻辑识别 UA(如用正则或库判断是否为移动端/微信内置浏览器),然后返回适配的 HTML、JS 或 CSS。例如:
    – 移动端 UA → 返回精简版 JS + viewport 优化 HTML
    – 桌面 Chrome → 返回完整功能 JS + WebAssembly 模块
  • 注意:若后端对所有 UA 都返回完全相同的资源,却设置 Vary: User-Agent,只会徒增缓存分裂,毫无意义。

Nginx 中正确配置 Vary 与缓存协同

要确保 Vary 生效,必须让缓存键(proxy_cache_key)与 Vary 声明的字段严格一致:

  • 若响应头设 Vary: Accept-Encoding,缓存键中必须包含 $http_accept_encoding:
proxy_cache_key "$scheme$request_method$host$request_uri$http_accept_encoding";
  • 若响应头设 Vary: User-Agent,且确有必要(如 SSR 渲染不同布局),建议先标准化 UA(避免版本号波动),再写入缓存键:
map $http_user_agent $ua_type {
  ~*mobile|android|iphone|ipad "mobile";
  default "desktop";
}
proxy_cache_key "$scheme$request_method$host$request_uri$ua_type";
add_header Vary "User-Agent";
  • 禁止仅用 proxy_hide_header Vary 来“绕过问题”——这会让下游缓存误判为可通用缓存,引发内容错乱(如手机用户看到桌面版 JS)。

静态资源建议最小化 Vary

对于 JS/CSS/图片等静态资源,通常无需 Vary User-Agent:

  • 现代前端构建已通过响应式设计、特性检测替代 UA 判断;
  • 压缩格式由 CDN 或 Nginx 统一处理,只需 Vary: Accept-Encoding 即可;
  • 若资源确实无差别(如一个 PNG 图片),连 Vary: Accept-Encoding 也可省略——但需确认服务器未对同一路径返回不同编码版本。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

5106

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1249

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

5024

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

980

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1896

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3585

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

4673

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

3060

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

968

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
燕十八nginx精品视频教程
燕十八nginx精品视频教程

共23课时 | 8万人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习