User-Agent 解析

把 UA 字符串贴进来,拆成浏览器、引擎、系统、设备、厂商和 CPU 架构几个字段。规则全部在本机跑,UA 不会发给任何人。

预设样本

为什么必须先判 Edge,再判 Chrome

桌面版 Edge 的 UA 长这样:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0。它把 Chrome、Safari 的标记原样抄了一遍,只多了末尾的 Edg/。如果先按 Chrome 匹配,所有 Edge 都会被认成 Chrome。浏览器 UA 的历史就是不断往里追加标记、谁都不敢删的过程,所以规则表必须写成「先具体、后笼统」。

同理,微信(MicroMessenger)、QQ 浏览器(MQQBrowser)、UC(UCBrowser)、百度(baidubrowser)、三星(SamsungBrowser)、华为(HuaweiBrowser)这些国产浏览器的 UA 里都带着 Chrome 和 Safari,必须先判。微信还有两种形态:微信内置浏览器带 MicroMessenger,微信小程序的 webview 也会带,但内嵌的 X5 内核又会在 Chrome 之外额外写 MQQBrowser,所以规则里两者都要覆盖。

User-Agent Reduction 让能拿到的信息越来越少

2022 年起 Chrome 开始推行 UA 缩减:桌面版的次要版本号被冻结(Chrome/126.0.0.0),平台版本也只保留主要版本(Windows NT 10.0 就是 10 及以上),Android 的小版本号同样被砍掉。Safari 也早就把 macOS 版本冻结在 10_15_7。也就是说,靠 UA 精确区分「用户是 Win10 还是 Win11」「macOS 到底是 12 还是 14」已经不可能了。

更现实的做法是用 Client Hints(Sec-CH-UA、Sec-CH-UA-Platform、Navigator.userAgentData),它能给出结构化的品牌、平台和版本,且可以按需申请高熵字段。但 Client Hints 只在 Chromium 系可用,Safari 和 Firefox 至今没有完整实现,所以实践中往往还得 UA 兜底。

不要把 UA 用在关键逻辑上

UA 完全由客户端提供,任何脚本、爬虫、插件都能随便伪造一行。用它做前端适配(比如提示「请升级浏览器」)没问题,但用它做安全判定就是自找麻烦:按 UA 屏蔽爬虫会被一行假 UA 绕过,按 UA 分发不同逻辑会给伪造者开方便之门。真正影响安全或数据正确性的判断应该放在服务端,并对客户端提供的一切信息保持怀疑。

另外 UA 长度和内容都可能被压缩、截断或本地化改写。做统计分析时,看到「其他/未知」比例很高,多半不是因为用户用了怪浏览器,而是自己的规则表没跟上新版本。这份表的规则按 2026 年中的主流浏览器整理,新版本发布后可能需要补充特征串。