使用方法
- 文本框默认写了三条 UA,每行一条。按 Ctrl+Enter(Mac 上 Cmd+Enter)重新解析;万一被清空,点解析时会自动填回这三条。
- 「样本 UA」下拉里有八条常见 UA,选一条就追加到文本框末尾,用来对比不同浏览器、不同系统的 token 结构差异。
- 「最多解析行数」默认 3,允许 1 到 50。贴进来的行数超过它时不截断,而是报出实际行数让你决定是调大上限还是删行;光标停在这个框里按回车同样触发一次解析。
- 结果区给第一条 UA 的 token 数(产品与注释各几个)和四项识别结论:浏览器与版本、渲染引擎、操作系统、设备类型。
- 清单区逐条列出每条 UA 的 token 明细,第一条完整展开为「[产品] / [注释]」两栏,其余各给一行摘要。
- 清单下面是所有 token 的汇总表,默认显示 6 行,点「加载更多」展开全部,点「导出 CSV」存成带字节序标记的文件;「复制对照表」复制字段含义表的 TSV。
- 解析只读文本框里的内容,不联网也不查库;识别不到的字段一律显示「未知」,不猜一个最接近的值。
- 文本框为空、某行括号不配对、单行过长、行数超限、上限填了小数,都会给出针对该条的具体提示,不拿上一次的结果冒充本次输出。
这个 User-Agent 解析工具能解决什么问题
第一类是日志与工单里的 UA 看不懂。访问日志里躺着几千行 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36,人工扫一眼只能看出有 Chrome,看不出它是 64 位 Windows、也看不出它其实只报了主版本。拆成 token 之后,系统、架构、引擎、浏览器版本各归各位。
第二类是「按空格切分」写出来的解析脚本会错。UA 的注释段内部是带空格的,KHTML, like Gecko 这一段里就有两个空格,按空格一刀切会把它切成三个碎片。正确的做法是按括号深度配对,把整段注释当一个 token。
第三类是 iPhone 被误判成 Mac。iPhone 的 UA 注释里写着 CPU iPhone OS 17_1 like Mac OS X,里面确实含 Mac OS X 这个子串;如果先判 macOS 再判 iOS,所有 iPhone 都会落到 macOS。本页按 iPhone、iPad、iOS 优先的顺序判定,并在结果里把 iOS 单独标出来。
第四类是版本判断越来越不可靠。Chrome 的 UA reduction 与 Firefox 的同类方案已经把小版本号抹平成 Chrome/120.0.0.0,靠 UA 已经分不出 120.0.1 与 120.0.2。本页照实显示 UA 里写了什么,并提示需要精确版本时应改用 Sec-CH-UA 客户端提示。
这个工具在本站也叫「User-Agent解析」,名字里的 User-Agent 就是浏览器发给服务器的那段身份字符串,下面会讲清它的结构。
计算原理与变量说明
UA 的语法来自 RFC 7231 的 product token:一串「产品名/版本号」之间用空格分隔,中间可以插入括号注释。分词规则只有两条:遇到左括号就按括号深度往下找配对的右括号,整段(不含两侧括号)作为一个注释 token;否则一直读到空格或左括号为止,读到的内容若含斜杠就按第一个斜杠切成 name 与 version,作为产品 token。
括号深度配对是这个算法的要点:深度从 0 起,遇左括号加一、遇右括号减一,减到 0 就说明找到了配对的右括号。注释内部允许出现嵌套括号与任意空格,所以 KHTML, like Gecko 是一个整体,而不是三个碎片。若走到字符串末尾深度仍不为 0,说明括号不配对,本页直接报行号而不是给出半截结果。
识别分四步,顺序不能乱。操作系统:先匹配 iPhone、iPad、iOS,再匹配 Android,再匹配 Windows NT 10.0(Windows 10 与 11 共用这个值)与 Windows NT 6.1(Windows 7),然后才是 Mac OS X,最后 Linux。iOS 必须排在 macOS 前面,理由就是 iPhone 的 UA 里含 Mac OS X。浏览器:逐 token 扫描,Chrome、Firefox 各自记录,Version 只在浏览器还是未知时才记为 Safari(因为 Safari 的真实版本放在 Version 后面),Edg 最后判定并覆盖前面的 Chrome——Chromium 版 Edge 的 UA 里同时带 Chrome 与 Edg。
渲染引擎:取 AppleWebKit 的版本号记作 WebKit,出现 Gecko 则记作 Gecko。设备:只要整串里含 Mobile、Android 或 iPhone 之一就判为移动设备,否则桌面。所以 curl/8.4.0 会被判成桌面——非浏览器客户端没有移动标记,本页不猜。
Mozilla/5.0 不是 Mozilla。这个前缀是 1990 年代网景与 IE 军备竞赛留下的伪装:当时的服务器按 UA 里有没有 Mozilla 决定要不要发高级页面,后来的浏览器为了不被降级就都带上它。今天几乎所有浏览器 UA 都以它开头,它不是「这个请求来自 Mozilla」的证据。
UA 冻结改变了什么。Chrome 的 UA reduction 与 Firefox 的同类方案把小版本号冻成 0:Chrome/120.0.0.0 里的三个 0 不代表真的构建号,而 Firefox 的真实版本要读 rv:121.0 后面的值。需要精确版本时应改用客户端提示 Sec-CH-UA(含完整版本与平台信息),UA 嗅探正逐步被它取代。
为什么 UA 嗅探是反模式。按身份检测意味着每出现一个新浏览器就要补一条规则,且任何客户端都能伪造 UA;按能力检测(feature detection)直接问「你支不支持这个 API」,不会因为 UA 变了而失效。UA 的合理用途是日志分析、异常排障与统计,不是分支业务逻辑。
完整示例(数值仅作演示)
基准 UA Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 拆出 6 个 token,其中产品 4 个、注释 2 个,按顺序是 [产品] Mozilla/5.0、[注释] Windows NT 10.0; Win64; x64、[产品] AppleWebKit/537.36、[注释] KHTML, like Gecko、[产品] Chrome/120.0.0.0、[产品] Safari/537.36,识别为 Chrome 120.0.0.0、WebKit 537.36、Windows 10/11、桌面。
换成 iPhone 的 UA:Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1,拆出 7 个 token,识别为 Safari 17.1、iOS、移动设备。它的注释里虽然有 Mac OS X,但因为 iOS 判定在前,系统字段是 iOS 而不是 macOS——这正是顺序敏感的地方。
换成命令行客户端:curl/8.4.0 只有 1 个 token,产品名 curl、版本 8.4.0,浏览器、引擎、系统三项全是未知,设备按默认判为桌面。它没有任何伪装前缀,反而是最诚实的一类客户端:日志里看到这种 UA,就知道对面是脚本而不是浏览器。
八条常见 UA 的解析结果如下,token 数的差别主要来自注释段与附加标记的多少。
| 样本 | token 数 | 浏览器 | 系统 | 设备 |
|---|---|---|---|---|
| Chrome 120 / Windows 10 | 6 | Chrome 120.0.0.0 | Windows 10/11 | 桌面 |
| Safari 17.0 / macOS | 6 | Safari 17.0 | macOS | 桌面 |
| Firefox 121.0 / Windows 10 | 4 | Firefox 121.0 | Windows 10/11 | 桌面 |
| Edge 120 / Windows 10 | 7 | Edge 120.0.2210.91 | Windows 10/11 | 桌面 |
| Chrome 120 / Android 14 | 7 | Chrome 120.0.0.0 | Android | 移动设备 |
| Safari 17.1 / iPhone | 7 | Safari 17.1 | iOS | 移动设备 |
| Chrome 119 / Linux x86_64 | 6 | Chrome 119.0.0.0 | Linux | 桌面 |
| curl/8.4.0 | 1 | 未知 | 未知 | 桌面 |
读这张表时注意 Firefox 的 token 数最少:它的 UA 里没有 AppleWebKit 与 Safari 兼容声明,只有 Mozilla/5.0、一条注释、Gecko/20100101、Firefox/121.0 四项。Edge 最多,因为它在 Chrome 的完整结构后面又追加了 Edg/120.0.2210.91。
User-Agent 字段与关键字对照表
下表列出 UA 里最常出现的十二个字段与关键字,以及它们在识别时各自承担的角色。
| 字段 / 关键字 | 含义 | 字段 / 关键字 | 含义 |
|---|---|---|---|
| Mozilla/5.0 | 历史遗留伪装前缀,几乎所有浏览器都带 | Version/17.0 | Safari 的真实版本在这里 |
| AppleWebKit/537.36 | 渲染引擎 WebKit 分支版本 | rv:121.0 | Firefox 的真实版本放在 rv: 后面 |
| KHTML, like Gecko | 与 KHTML/Gecko 兼容的历史声明 | Windows NT 10.0 | Windows 10 与 11 共用 10.0 |
| Chrome/120.0.0.0 | Chrome 主版本(UA 冻结后只给主版本) | Win64; x64 | 64 位 Windows + x86_64 架构 |
| Safari/537.36 | Safari 兼容声明 | Mobile | 移动端标记 |
| Edg/120.x | Chromium 版 Edge | curl/8.4.0 | 非浏览器客户端,直接暴露真实身份 |
读法:前半列是「谁」,后半列是「在哪」。前六项告诉你浏览器与引擎是什么,后六项告诉你版本藏在哪、跑在什么系统什么架构上、是不是移动端。
结果边界、判定顺序与适用说明
- 文本框为空时提示「UA 字符串不能为空」,不拿上一次的结果冒充本次输出。
- 某一行左括号没有配对的右括号时,报出具体行号与左右括号个数,例如「第 2 行有 2 个左括号但只有 1 个右括号」。
- 单行长度超过 2000 字符时提示该行过长并给出实测长度,UA 超过这个长度通常不是浏览器发出的。
- 贴进来的行数超过「最多解析行数」时报出实际行数与当前上限,由你决定调大上限还是删行,不静默截断。
- 「最多解析行数」填了小数、超出 1 到 50 或不是数字时,分别给出针对该框的具体提示。
- 系统判定按 iPhone、iPad、iOS、Android、Windows NT 10.0、Windows NT 6.1、Mac OS X、Linux 的顺序,命中即停;不在这些里的系统显示「未知」,不猜。
- 浏览器判定里 Edg 覆盖 Chrome,Version 只在浏览器未知时才判 Safari;不在这几类里的一律显示「未知」。
- 本页只解读 UA 里写了什么,不验证 UA 真伪:任何客户端都能改 UA,涉及权限与业务逻辑的判断要另行校验。
常见问题
为什么 iPhone 不会被判成 macOS?判定顺序是怎样的?
因为 iPhone 的 UA 注释里写着「CPU iPhone OS 17_1 like Mac OS X」,含 Mac OS X 子串。本页先匹配 iPhone、iPad、iOS,再匹配 Android、Windows NT 10.0、Windows NT 6.1,最后才匹配 Mac OS X,命中即停,所以 iPhone 落到 iOS。反过来写就会把所有 iPhone 判成 Mac。
Mozilla/5.0 是不是说这个请求来自 Mozilla 浏览器?
不是。这是 1990 年代网景与 IE 军备竞赛留下的伪装前缀:当年服务器按 UA 里有没有 Mozilla 决定发不发高级页面,后来的浏览器为了不被降级就都带上它。今天几乎所有浏览器 UA 都以它开头,识别时应当忽略。
为什么 Chrome/120.0.0.0 后面三个零分不出小版本?
因为 UA 冻结。Chrome 的 UA reduction 与 Firefox 的同类方案把小版本号抹平,主版本后面的 0.0.0 不是真实构建号;Firefox 的真实版本要读 rv: 后面的值。需要精确版本请用 Sec-CH-UA 客户端提示,不要靠 UA。
按空格切分 UA 为什么不行?
因为注释段内部有空格。KHTML, like Gecko 这一整段里有两个空格,按空格切会把它切成三个碎片,后面的字段含义全乱。正确做法是按括号深度配对,遇左括号加一、遇右括号减一,减到 0 就是配对的右括号,整段当一个注释 token。
Edge 的 UA 里为什么同时有 Chrome 和 Edg?
Chromium 版 Edge 基于 Chromium,为了兼容按 UA 做分支的老站点,它保留了 Chrome/120.0.0.0 与 Safari/537.36 的完整声明,只在末尾追加 Edg/120.0.2210.91。本页把 Edg 放在最后判定,用它覆盖前面读到的 Chrome。
curl/8.4.0 这类客户端为什么显示桌面?
因为设备字段只在整串里含 Mobile、Android 或 iPhone 时才判为移动设备,其余一律按桌面处理。curl 没有移动标记,本页不猜它是手机还是服务器;这类 UA 的价值在于它不伪装,日志里一眼就能认出是脚本。
这个工具免费吗?
免费,无需注册即可使用。
输入的数据安全吗?
安全。解析在当前浏览器本地完成,不会上传输入内容。
相关工具
- URL 解析:把请求地址拆成协议、主机、路径与查询参数。
- MAC 地址查询:查网卡地址段对应的厂商信息。
- 正则表达式测试工具:写匹配 UA 的正则时先在这里试。
- Query 字符串解析:把 URL 里的查询串拆成键值对。
- CSS 校验:按浏览器差异排完版之后,顺手校验样式表。