通俗讲解 User-Agent 字符串:它长什么样、如何逐段读懂、为何仍写着 Mozilla,以及如何几秒内查看你自己的。
每次浏览器加载页面时,都会附带发送一小段文字,称为 User-Agent 字符串——一个自我声明的标签,宣告你正在使用哪种浏览器、渲染引擎和操作系统。乍看之下它像一堆无意义的乱码,但每一部分都是一个独立的令牌,读懂它就能准确知道网站认为自己在和什么打交道。
核心要点
- User-Agent(UA)是一个 HTTP 请求头,随每次请求发送,标明你的浏览器、渲染引擎、操作系统和设备类型。
- 它读起来像
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36——是一串令牌,而非一句完整短语。 - 几乎所有浏览器的 UA 都以
Mozilla/5.0开头,这是历史兼容性原因造成的,并不是因为它真的是 Mozilla 出品的软件。 - 你可以在 DevTools 中运行
navigator.userAgent立即读取自己的 UA,或直接查看浏览器发出的请求头。 - 由于该字符串是自我声明且极易修改的,Chromium 正逐步转向 User-Agent Client Hints,一种结构更清晰、可验证性更强的替代方案。
User-Agent 字符串究竟是什么?
User-Agent 字符串是浏览器在每次 HTTP 请求中主动附带的一行文字,位于一个名为 User-Agent 的请求头里。它的作用是让服务器据此调整响应:向手机发送移动端友好的布局、向非常老旧的浏览器提示不支持某功能,或仅仅是记录哪些浏览器实际访问了网站。它自 20 世纪 90 年代初最早的浏览器时代起就已存在,而其格式为了向后兼容一直沿用至今——这正是它如今看起来如此杂乱的原因。
一个真实 User-Agent 字符串的解剖
以下是一个典型的桌面版 Chrome UA 字符串,按部分拆解:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
| 令牌 | 含义 |
|---|---|
Mozilla/5.0 | 一个历史遗留的兼容性令牌——见下文,并不意味着这是 Mozilla/Firefox 浏览器 |
(Windows NT 10.0; Win64; x64) | 操作系统(Windows 10/11)与 CPU 架构(64 位) |
AppleWebKit/537.36 | 渲染引擎所继承的底层引擎谱系 |
(KHTML, like Gecko) | 一句声明其行为与另外两个历史引擎相似的兼容性短语 |
Chrome/124.0.0.0 | 实际的浏览器名称及其版本号 |
Safari/537.36 | 另一个兼容性令牌,之所以存在是因为 Chrome 的引擎 Blink 是从 WebKit(Safari 的引擎)分支而来 |
Firefox 和 Safari 遵循相同的模式,只是令牌不同——Firefox 是 Gecko/20100101 Firefox/125.0,Safari 是 Version/17.4 Safari/605.1.15——但整体结构(平台信息、引擎令牌,再到浏览器名称与版本)在各家浏览器间是一致的。
为什么几乎所有浏览器仍写着"Mozilla"
这是最让人困惑的部分:Chrome、Safari、Edge,甚至一些非浏览器工具,其 UA 都以 Mozilla/5.0 开头,尽管它们与 Mozilla 项目毫无关系。简单说说这段历史:20 世纪 90 年代中期,Netscape Navigator 的内部代号就叫"Mozilla",当时的网站开始检测这个令牌,来判断访问者的浏览器是否支持当时较为先进的功能(比如框架)。当 Internet Explorer 也想启用同样的功能时,它在自己的 UA 字符串里加上了 Mozilla,以通过这些检测。此后每一款新浏览器都照做,以避免被服务器返回阉割版页面,这个令牌就此永久保留了下来。它是 20 世纪 90 年代浏览器检测大战留下的化石,而非一个有实际意义的标识符——是 Web 历史上最著名的怪癖之一。
如何查看你自己的 User-Agent
有两种方式可以查看,它们偶尔会出现不一致:
通过 JavaScript,打开浏览器开发者工具的控制台,运行:
navigator.userAgent
这会返回页面脚本能读取到的确切字符串。
通过原始请求,打开开发者工具的 Network 面板,刷新页面,点击任意一个请求,在请求头中查看 User-Agent。这是服务器实际收到的内容——通常与 navigator.userAgent 完全一致,但浏览器扩展或代理可能只改写其中一个而不动另一个,这种不一致本身就是可被检测到的信号。
BrowserInsight 的内核检测工具会并排展示你声明的 User-Agent 与浏览器实际使用的渲染引擎,让你一眼看出两者是否一致。
User-Agent 作为身份与指纹识别信号
由于 UA 字符串在每次请求中都会不请自来地披露操作系统、架构、浏览器及版本信息,它一直以来也充当着一种被动的身份识别信号——是构成浏览器指纹的众多输入之一。这也是为什么 Chromium 正逐步将这个旧版字符串冻结为一个通用存根,转而拥抱 User-Agent Client Hints(UA-CH)——一种仅在服务器明确请求时才披露细节的结构化 API,而非默认广播一切。
一个提醒:伪装很容易,但被识破也很容易
由于 UA 字符串只是自我声明的文本,修改它只需要一个浏览器设置或一个扩展。人们出于测试、访问受浏览器限制的内容,或隐私考虑而这么做。但 UA 只是浏览器暴露的数十个信号之一,其余信号很少会被一并修改以保持一致——因此,一个声称是 Safari、但其 JavaScript 引擎、client hints 和渲染细节都在说别的话的页面,很快就会被网站识破这种矛盾。如果你想了解这种检测具体是如何运作的,可参考如何检测 User-Agent 伪装。给出于好奇修改 UA 的人的提示是:这只改变了一个请求头所说的内容,并不会改变你的浏览器实际是什么。
常见问题
为什么我的 User-Agent 写着"like Gecko",可我用的并不是 Firefox?
(KHTML, like Gecko) 是另一个兼容性化石,并非对你所用引擎的真实声明。它表示对 Gecko/KHTML 时代布局行为的广泛支持,好让为那些引擎编写的老网站依然能正常渲染。无论实际运行的是哪种引擎,它都会出现在 Chrome、Safari 和 Edge 中。
User-Agent 字符串就等于我的浏览器指纹吗?
不是——它只是指纹的一项输入,而非指纹本身。完整的浏览器指纹会综合 UA 与 canvas 渲染、WebGL 输出、字体、屏幕参数等多项信号。仅凭 UA 只能识别大致类别(浏览器家族、粗略的操作系统),无法单独唯一识别某台设备。
两个不同的浏览器能有相同的 User-Agent 吗?
可以。由于该字符串是自我声明的,任何浏览器技术上都可以发送它想要的任意 UA 文本,包括直接照抄自另一款完全不同的浏览器。这正是为什么网站会将 UA 与其他信号交叉核对,而不是单独信任它。
User-Agent 字符串最终会消失吗?
不会立刻消失,但它的作用正在缩小。Chromium 正逐步将旧版字符串冻结为低信息量的存根,同时让 User-Agent Client Hints 接手成为主要的结构化通道。Firefox 和 Safari 目前没有对应的 UA-CH 实现,仍依赖传统字符串。
结论
User-Agent 字符串看起来很神秘,但其实只是一份积攒了三十多年、充满兼容性考量的令牌清单——平台信息、引擎谱系,再加上浏览器名称与版本,都是浏览器们为了不互相破坏对方的网站而逐步叠加的结果。一旦掌握了这个模式,读懂它就很直接;检查你自己的 UA,在开发者工具里只需一行代码。因为它是自我声明的,请把它当作一种"声称"而非保证——如果你想看看自己真实的引擎与身份信号与 UA 所声明的是否一致,不妨运行 BrowserInsight 的内核检测工具。
延伸阅读:


