User-Agent 字符串怎么读:UA 解析出浏览器、系统、设备的门道
讲清 User-Agent 字符串的结构和它为什么这么乱:浏览器、引擎、操作系统、设备类型各藏在哪个标记里,匹配顺序怎么定,以及怎么靠它把流量统计和兼容适配做对。
User-Agent 字符串怎么读:UA 解析出浏览器、系统、设备的门道
每次浏览器发请求,都会在 HTTP 头里塞一行 User-Agent。它本该是一句简单的自我介绍:我是谁、跑在什么系统上。但真打开一条现代 UA,你会发现它更像一份层层加码的历史档案。读懂它,你才能把流量统计、兼容适配、爬虫识别这几件事做对。
一条 UA 长什么样
先看一个真实的字符串:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
挨个拆:Windows NT 10.0 是操作系统(注意,NT 10.0 同时对应 Windows 10 和 11,系统层面分不开),Win64; x64 是架构,AppleWebKit/537.36 和 like Gecko 是引擎信息,Chrome/124.0.0.0 才是真正的浏览器和版本,末尾的 Safari/537.36 是个历史残留标记。
解析出来应该是:浏览器 Chrome 124,引擎 Blink,系统 Windows 10/11,设备类型桌面。可这一行里同时出现了 Mozilla、AppleWebKit、Gecko、Chrome、Safari 五个名字,真正的答案只有一个。这就是 UA 解析的全部难点。
它为什么这么乱:全是历史包袱
每个名字背后都是一次"为了兼容老服务器而撒的善意的谎"。
最早 Netscape 自称 Mozilla。后来 IE 想拿到 Netscape 才能看的网页,就也在 UA 里写上 Mozilla。再后来 Safari 用 WebKit 引擎,为了让那些只认 Mozilla 和 Gecko 的服务器给它走"好代码路径",写上了 like Gecko。Chrome 起步时套用 WebKit,顺手保留了 Safari 标记。Edge 换成 Chromium 内核后,又保留了 Chrome 标记。
结果就是:Chrome 里带 Safari,Edge 里带 Chrome,所有 WebKit 系浏览器都假装自己 like Gecko。没有谁敢删掉这些旧标记,因为总有老服务器靠子串匹配在嗅探,一删就被当成"不支持的浏览器"。包袱越滚越大,谁都不敢动。
匹配顺序就是全部门道
知道了这层谎言结构,解析逻辑的核心就清楚了:不能用子串匹配,必须按"从最具体到最通用"的顺序逐个试签名。
具体说:先查 Edg/,再查 OPR/ 和 SamsungBrowser/,这些都判完了再轮到通用的 Chrome/,最后才是 Safari/。一旦顺序反了,Edge 会被报成 Chrome,三星浏览器会被报成 Chrome,iOS 上的 Firefox 会被报成 Safari。统计报表里看着是一片 Chrome,其实里面混了一堆别的内核。
我自己踩过最深的坑是 iPad。iPadOS 13 起,桌面模式下的 iPad 发的是一个带 Mobile 标记的 Macintosh 字符串。只看 Macintosh 你会判成桌面 Mac,只看 Mobile 又可能判成手机。正确做法是看组合:Macintosh 加 Mobile 等于平板。当年我们的分析后台就因为这个,把一大块 iPad 流量算进了桌面,移动端转化数据莫名其妙地难看,排查了半天才发现是解析器的锅,不是漏斗的锅。
拿它能做什么:统计与适配
把 UA 解析对了,下游一连串决策才站得住:
把人和爬虫分开。一夜冒出的流量尖峰,到底是 AhrefsBot、GPTBot、ClaudeBot 在爬,还是真实用户?点名是哪个爬虫,你才好决定 Googlebot 留着、限速哪个、直接封哪个。这一步要在浏览器识别之前先过爬虫签名,顺便也能把 curl、Python-requests、HeadlessChrome 这类脚本客户端单独拎出来,给 IP 子网计算器 配合着做网关的允许或拒绝清单。
复现单浏览器的渲染 bug。用户贴来一句"页面坏了"加一串 UA,解析出"Android 14 上的 Samsung Internet 23、Blink 引擎",你就知道该去 Samsung Internet 里测,而不是从"安卓类 Chrome"瞎猜。
还有个容易读错的细节:别从 Safari/ 或 AppleWebKit/ 里读版本号,那是引擎构建号,Safari 的真实版本藏在 Version/ 标记里,读错的话 Safari 17 会显示成 Safari 605。
动手解析一条
理论看够了,直接把你手头的字符串丢进 User-Agent 解析器 跑一遍最直观:浏览器、引擎、系统、设备类型、爬虫标记一次拆全,全部在浏览器本地用手写正则跑,什么都不上传。需要核对接口返回头时,它和 JWT 解析器 一样,都是把一串看着头大的字符串摊开成你看得懂的结构。把这两件小事做对,后面的统计和适配就少踩很多坑。
Made by Toolora · Updated 2026-06-13