User-Agent
用法
客户端会在每个请求中包含 User-Agent,向服务器标识应用程序、操作系统和渲染引擎。服务器利用这些信息进行内容协商、分析统计和兼容性调整。
其值遵循产品令牌的结构化格式。每个令牌由产品名称和可选的版本构成,后跟圆括号中的可选注释。多个令牌以空格分隔。
User-Agent: <product>/<version> (<comment>) <product>/<version>
在实践中,由于历史兼容性模式,浏览器的 User-Agent 字符串已变得冗长而复杂。出于遗留原因,大多数浏览器都将 Mozilla/5.0 作为第一个令牌,后跟注释中的平台细节,然后是引擎和浏览器令牌。
基于 User-Agent 值提供不同内容的服务器实现了一种内容协商形式。搜索引擎爬虫通过该头部标识自身,使服务器能够应用爬虫特定的逻辑。机器人检测系统会分析 User-Agent 模式,以区分自动化流量与人类访客。
Sec-CH-UA 系列头部为 User-Agent 字符串提供了结构化的替代方案。User-Agent Client Hints 以解析过的、低熵的格式提供相同的信息。浏览器默认发送一组最小的提示,服务器通过 Accept-CH 响应头请求额外的细节。与完整的 User-Agent 字符串相比,这减少了被动指纹识别的面。
product
客户端软件的产品标识符。按照惯例,最重要的产品列在最前面。
version
与前面的产品令牌关联的版本字符串,以正斜杠分隔。
comment
圆括号中的额外细节,通常描述操作系统、设备或平台。注释出现在一个 product/version 对之后。
示例
桌面浏览器发送的 User-Agent 字符串包含平台、渲染引擎和浏览器版本。Mozilla/5.0 前缀是所有现代浏览器中都存在的历史遗留物。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.0.0.0 Safari/537.36
移动浏览器会在注释部分包含设备和移动平台信息。
User-Agent: Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.0.0.0 Mobile Safari/537.36
Chrome 的 UA 精简将次版本、构建和补丁部分冻结为 0.0.0。主版本会随每次发布递增。
搜索引擎爬虫使用独特的 User-Agent 值进行标识。注释中通常包含一个指向该爬虫文档的 URL。
User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Bingbot 使用基于 Chromium 的常青 UA 字符串。W.X.Y.Z 版本部分会自动更新以匹配当前的 Chrome 发布版本。
桌面:
User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/W.X.Y.Z Safari/537.36
移动:
User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.X.Y.Z Mobile Safari/537.36 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
命令行工具和 HTTP 库发送更短、更简单的值。
User-Agent: curl/8.4.0
自定义 API 客户端和机器人会包含描述性的产品名称、版本和联系 URL:
User-Agent: MyBot/1.0 (+https://example.re/bot)
隐私
User-Agent 字符串是一个重要的浏览器指纹识别向量。浏览器、版本、操作系统和平台细节的组合构成了一个近乎唯一的标识符,追踪脚本无需 cookie 或明确同意即可加以利用。
Chrome 的 User-Agent 精简计划会冻结字符串的一部分,并将详细信息转移到 Sec-CH-UA Client Hints,后者需要服务器通过 Accept-CH 明确选择加入。这将详细的客户端数据从被动暴露转变为主动协商。
服务器不应依赖 User-Agent 来做出诸如认证或访问控制之类的安全决策。客户端控制该值,并且能够轻而易举地伪造该字符串。