User-Agent 解析工具

按括号配对把 UA 拆成 product/version 与注释两类 token,再识别浏览器、渲染引擎、操作系统与设备类型;判系统时先判 iOS 再判 macOS。

默认示例:三条 UA,第一条是 Chrome 120 on Windows 10。
[1] Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 token 数 = 6(product 4 / comment 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 | 桌面 [2] 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 token 数 = 7 识别:Safari 17.1 | WebKit 605.1.15 | iOS | 移动设备 [3] curl/8.4.0 token 数 = 1 识别:未知 | 未知 | 未知 | 桌面

默认示例:三条 UA。文本框按 Ctrl+Enter(Mac 上 Cmd+Enter)重新解析,行数上限改动即重算,光标停在数量框里按回车同样触发一次。

使用方法

  1. 文本框默认写了三条 UA,每行一条。按 Ctrl+Enter(Mac 上 Cmd+Enter)重新解析;万一被清空,点解析时会自动填回这三条。
  2. 「样本 UA」下拉里有八条常见 UA,选一条就追加到文本框末尾,用来对比不同浏览器、不同系统的 token 结构差异。
  3. 「最多解析行数」默认 3,允许 1 到 50。贴进来的行数超过它时不截断,而是报出实际行数让你决定是调大上限还是删行;光标停在这个框里按回车同样触发一次解析。
  4. 结果区给第一条 UA 的 token 数(产品与注释各几个)和四项识别结论:浏览器与版本、渲染引擎、操作系统、设备类型。
  5. 清单区逐条列出每条 UA 的 token 明细,第一条完整展开为「[产品] / [注释]」两栏,其余各给一行摘要。
  6. 清单下面是所有 token 的汇总表,默认显示 6 行,点「加载更多」展开全部,点「导出 CSV」存成带字节序标记的文件;「复制对照表」复制字段含义表的 TSV。
  7. 解析只读文本框里的内容,不联网也不查库;识别不到的字段一律显示「未知」,不猜一个最接近的值。
  8. 文本框为空、某行括号不配对、单行过长、行数超限、上限填了小数,都会给出针对该条的具体提示,不拿上一次的结果冒充本次输出。

这个 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 106Chrome 120.0.0.0Windows 10/11桌面
Safari 17.0 / macOS6Safari 17.0macOS桌面
Firefox 121.0 / Windows 104Firefox 121.0Windows 10/11桌面
Edge 120 / Windows 107Edge 120.0.2210.91Windows 10/11桌面
Chrome 120 / Android 147Chrome 120.0.0.0Android移动设备
Safari 17.1 / iPhone7Safari 17.1iOS移动设备
Chrome 119 / Linux x86_646Chrome 119.0.0.0Linux桌面
curl/8.4.01未知未知桌面

读这张表时注意 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.0Safari 的真实版本在这里
AppleWebKit/537.36渲染引擎 WebKit 分支版本rv:121.0Firefox 的真实版本放在 rv: 后面
KHTML, like Gecko与 KHTML/Gecko 兼容的历史声明Windows NT 10.0Windows 10 与 11 共用 10.0
Chrome/120.0.0.0Chrome 主版本(UA 冻结后只给主版本)Win64; x6464 位 Windows + x86_64 架构
Safari/537.36Safari 兼容声明Mobile移动端标记
Edg/120.xChromium 版 Edgecurl/8.4.0非浏览器客户端,直接暴露真实身份

读法:前半列是「谁」,后半列是「在哪」。前六项告诉你浏览器与引擎是什么,后六项告诉你版本藏在哪、跑在什么系统什么架构上、是不是移动端。

结果边界、判定顺序与适用说明

常见问题

为什么 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 的价值在于它不伪装,日志里一眼就能认出是脚本。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。解析在当前浏览器本地完成,不会上传输入内容。

相关工具