讲师中心 微信公众号
AI工具推荐 视频效率加速

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

星磊酱_9037

星磊酱_9037

发布时间:2026-07-21 16:11:26

|

417人浏览过

|

来源于php中文网

原创

浏览器缓存不主动根据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 也可省略——但需确认服务器未对同一路径返回不同编码版本。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

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

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

5126

2023.06.20

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

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

1249

2023.07.04

js四舍五入
js四舍五入

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

5044

2023.07.04

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

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

980

2023.09.01

JavaScript转义字符
JavaScript转义字符

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

1916

2023.09.04

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

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

3605

2023.09.04

如何启用JavaScript
如何启用JavaScript

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

4693

2023.09.12

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

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

3060

2023.09.20

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

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

共23课时 | 8万人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn