User Agent 解析
粘贴任意 User-Agent 字符串,解析出浏览器、渲染引擎、操作系统、设备类型与 CPU 架构,并可复制 JSON 结果。
把 User-Agent 字符串变成人能看懂的信息。 默认已载入你当前浏览器的 User-Agent。粘贴其他字符串即可看到解析结果,JSON 明细可直接复制到缺陷单或测试用例里。
粘贴任意 User-Agent 字符串,解析出浏览器、渲染引擎、操作系统、设备类型与 CPU 架构,并可复制 JSON 结果。
把 User-Agent 字符串变成人能看懂的信息。 默认已载入你当前浏览器的 User-Agent。粘贴其他字符串即可看到解析结果,JSON 明细可直接复制到缺陷单或测试用例里。
现代 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 也做了类似的模糊处理。如果一个版本号圆整得可疑,那它多半就是被冻结过的。
设备识别是最不可靠的一环。字符串里根本没有设备字段,只能靠 Mobile、iPad、Tablet 这类标记的有无来推断。安卓平板是经典陷阱——很多只能靠缺少 Mobile 标记来判断;而 iPadOS 在默认配置下会刻意把自己伪装成桌面版 Mac。
只要是会改变行为的判断,都应该检测能力而不是标签。if ('share' in navigator) 是正确且长期有效的写法;if (isSafari) 会在另一个引擎实现同一 API、或 Safari 修好某个缺陷的那一刻失效。至于布局,CSS 媒体查询对实际视口和输入方式的描述,远比任何设备猜测准确。
User-Agent 真正不可替代的场景是数据分析、崩溃归类和缺陷复现。知道某个堆栈只出现在 Gecko 上、某个布局错位只限于三星浏览器,就能把一份无法复现的反馈变成明确的测试用例。现代的替代方案是 User-Agent Client Hints API,它以结构化字段暴露同样的事实,并且完整平台版本这类高熵信息必须显式申请才能拿到。