User Agent 解析

粘贴任意 User-Agent 字符串,解析出浏览器、渲染引擎、操作系统、设备类型与 CPU 架构,并可复制 JSON 结果。

把 User-Agent 字符串变成人能看懂的信息。 默认已载入你当前浏览器的 User-Agent。粘贴其他字符串即可看到解析结果,JSON 明细可直接复制到缺陷单或测试用例里。

浏览器
渲染引擎
操作系统
设备类型
CPU 架构

User-Agent 为什么长成这样

三十年互相假扮的历史沉积

现代 User-Agent 与其说是描述,不如说是一层层化石。几乎所有桌面浏览器仍以 Mozilla/5.0 开头,而这个标记自 Netscape 输掉浏览器大战之后就不再有任何含义。它之所以留下来,是因为早期服务器会先嗅探 Mozilla 再决定是否下发框架页面,于是每个竞争者都加上这个标记以免被降级。只要有一个浏览器靠撒谎拿到了更好的页面版本,其余浏览器就必须撒一模一样的谎,否则就会流失用户。

字符串的其余部分也是同一个螺旋的产物。Chrome 早在 2013 年就不再使用 WebKit,KHTML 更是消亡已久,但它至今仍发送 AppleWebKit/537.36 (KHTML, like Gecko)。Edge 用 Edg/ 而不是 Edge/,正是因为太多站点对旧标记做了子串匹配并返回错误的降级页面。Safari 的真实版本藏在 Version/ 标记里,末尾的 Safari/537.36 早已冻结。所以解析必须按从最具体到最宽泛的顺序进行:每个 Chromium 分支都自称 Chrome,每个 WebKit 浏览器都自称 Safari,只能让第一个确定的匹配胜出。

哪些能信,哪些不能

这是一个由客户端提供的请求头,因此它只是线索,永远不是证据。任何 HTTP 客户端都可以随意填写,用户也常常通过扩展或开发者工具伪造。把它当作日志里的辅助信息,而不是鉴权输入或安全边界。

即便没人撒谎,这些值也越来越粗。Chrome 和 Edge 现在把次版本段冻结为 0.0.0 并上报简化的平台串,Windows NT 10.0 同时覆盖 Windows 10 和 Windows 11,macOS 更是无论实际版本都固定在 10_15_7 多年。Firefox 也做了类似的模糊处理。如果一个版本号圆整得可疑,那它多半就是被冻结过的。

设备识别是最不可靠的一环。字符串里根本没有设备字段,只能靠 MobileiPadTablet 这类标记的有无来推断。安卓平板是经典陷阱——很多只能靠缺少 Mobile 标记来判断;而 iPadOS 在默认配置下会刻意把自己伪装成桌面版 Mac。

大多数情况下应改用特性检测

只要是会改变行为的判断,都应该检测能力而不是标签。if ('share' in navigator) 是正确且长期有效的写法;if (isSafari) 会在另一个引擎实现同一 API、或 Safari 修好某个缺陷的那一刻失效。至于布局,CSS 媒体查询对实际视口和输入方式的描述,远比任何设备猜测准确。

User-Agent 真正不可替代的场景是数据分析、崩溃归类和缺陷复现。知道某个堆栈只出现在 Gecko 上、某个布局错位只限于三星浏览器,就能把一份无法复现的反馈变成明确的测试用例。现代的替代方案是 User-Agent Client Hints API,它以结构化字段暴露同样的事实,并且完整平台版本这类高熵信息必须显式申请才能拿到。

开源说明:使用原生 JavaScript 实现,不依赖第三方库。

常见问题

为什么 Chrome 同时自称 Mozilla 和 Safari?
纯属历史兼容。服务器过去先嗅探 Mozilla 才发送现代标记,后来又嗅探 Safari 才发送 WebKit 专用 CSS。各家浏览器都加上这些标记以免拿到降级页面,如今再删掉反而会弄坏那些仍在检查的站点。
能不能用 User-Agent 做安全判断?
不能。它是客户端完全可控的请求头,可以填成任意值。只应用于诊断和统计。任何涉及访问控制或策略强制的逻辑,都必须依赖认证,而不是这种自报的字符串。
为什么我的 macOS 版本显示成 10.15.7?
Safari 和 Chrome 有意把上报的 macOS 版本冻结在 10_15_7,以缩小指纹面。浏览器知道真实版本,但不会放进请求头。Client Hints 可以提供,但必须站点明确申请。
工具怎么区分平板和手机?
它会查找 iPad 标记、不含 Mobile 的 Android 串,或显式的 Tablet 标记。这与多数库的做法一致,但本质上仍是启发式。部分安卓平板仅凭字符串确实无法与大屏手机区分。
我的 User-Agent 会被上传吗?
不会。解析完全用正则在你的浏览器本地完成,不上传任何内容。默认值读取自本地的 navigator.userAgent,始终不离开当前页面。
除了嗅探 User-Agent 还有什么更好的做法?
能力判断用特性检测,布局用 CSS 媒体查询,确实需要平台信息时用 User-Agent Client Hints API。Client Hints 给出的是结构化字段,且高熵细节需要显式申请。