chrome 110+ 默认精简服务端 ua,但 navigator.useragent 仍返回兼容性完整字符串,导致前后端不一致;应改用异步的 navigator.useragentdata.gethighentropyvalues() 获取结构化、语义对齐的设备信息。

Chrome 110+ 的 User-Agent 已默认精简,但 navigator.userAgent 仍可读取完整值
Chrome 从 110 版本起启用了 User-Agent Reduction(UA Reduction)策略,服务端收到的 HTTP User-Agent 请求头已大幅精简(例如移除 CPU 架构、平台版本细节),但前端 JavaScript 中的 navigator.userAgent 默认仍返回“兼容性保留版”完整字符串——这不是 bug,是刻意设计的渐进过渡机制。
这意味着:服务端看到的是精简 UA(如 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36),而前端 JS 读到的可能是带 Edg/125.0.0.0 或 Firefox/126.0 等完整标识的字符串。这种不一致常导致前端 UA 解析逻辑误判。
- 若你依赖
navigator.userAgent做浏览器识别或降级处理,现在大概率不准了 - Chrome 本身提供
navigator.userAgentData(需 HTTPS)作为替代,但 Firefox / Safari 尚未完全支持 -
User-Agent精简不可关闭,也无法通过chrome://flags恢复旧格式
用 navigator.userAgentData 取代 navigator.userAgent 做客户端检测
这是目前最合规的替代方案,返回结构化数据,避免字符串解析错误,且与服务端收到的精简 UA 语义对齐。
注意:navigator.userAgentData 是异步可选 API,需显式请求权限,且仅在安全上下文(HTTPS 或 localhost)中可用:
if ('userAgentData' in navigator) {
navigator.userAgentData.getHighEntropyValues(['platform', 'architecture', 'model', 'mobile'])
.then(uaData => {
console.log(uaData.platform); // "Windows"
console.log(uaData.mobile); // false
console.log(uaData.brands); // [{brand: "Chromium", version: "125"}, {brand: "Google Chrome", version: "125"}]
});
}
-
getHighEntropyValues()是关键,不调用它,brands里只有基础品牌,platform等字段为undefined - 首次调用会触发权限提示(仅 Chromium 系),用户拒绝后后续调用返回空对象
- Safari 目前只支持
getHighEntropyValues([])返回空,Firefox 尚未实现该 API
服务端 UA 解析必须放弃“精确匹配”,转向品牌 + 渲染引擎组合判断
精简后的 UA 字符串不再包含可靠版本号(如 Chrome 125 的 UA 中 Chrome/125.0.0.0 是占位符,实际版本可能为 125.0.6422.142),也不再暴露 OS 内部版本(Windows NT 10.0 不再区分 22H2/23H2)。
- 不要用正则匹配
/Chrome\/(\d+)/提取主版本——它返回的是“平台级版本”,和实际安装版本无关 - 优先检查
brands数组:若含{brand: "Google Chrome", version: "125"},才代表真实 Chrome 125+ - 服务端应降级依赖 UA:改用特性检测(
Accept-CH头 + Client Hints)、或结合 TLS 指纹、JS 运行时能力探测 - Nginx / Apache 日志中的 UA 字段体积变小,但解析逻辑必须同步更新,否则统计报表会出现大量“Unknown Chrome 0.0.0.0”
本地开发调试时,localhost 是唯一能稳定启用 userAgentData 的非 HTTPS 环境
Chrome 对 navigator.userAgentData 的安全限制非常严格:http://127.0.0.1、http://[::1]、甚至 file:// 协议都不行,只有 http://localhost 被明确豁免。
- 开发时务必用
localhost启服务(如npx serve -l 3000),别用127.0.0.1:3000 - 测试
getHighEntropyValues前先检查navigator.permissions.query({name: 'userAgent'})状态,避免静默失败 - CI 环境或 E2E 测试若跑在无头 Chrome 中,需加启动参数:
--unsafely-treat-insecure-origin-as-secure="http://localhost" --user-data-dir=/tmp/chrome-test
UA Reduction 不是功能开关,而是底层协议层的长期演进。真正麻烦的不是怎么读 UA,而是所有基于 UA 字符串做决策的旧逻辑——它们现在都成了隐性技术债。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











