1. User Agent基础概念解析

User Agent(用户代理)是HTTP协议中一个至关重要的请求头字段,它像一张数字身份证,向服务器表明客户端的身份信息。每次当你用浏览器访问网站时,浏览器都会自动在HTTP请求头中包含这个标识字符串,格式通常如下:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36

这个看似杂乱的字符串实际上包含多个关键信息段,用特定的语法规则组织:

  • Mozilla/5.0 是历史遗留的兼容性标识
  • 括号内的 Windows NT 10.0; Win64; x64 表示操作系统平台
  • AppleWebKit/537.36 是渲染引擎信息
  • KHTML, like Gecko 是引擎兼容性说明
  • Chrome/91.0.4472.124 是浏览器品牌和版本号
  • 最后的 Safari/537.36 则是WebKit的兼容性标记

注意:现代浏览器出于隐私保护考虑,已经开始实施User-Agent削减计划(User-Agent Reduction),许多详细参数会被通用值替代,真实设备信息需要通过User-Agent Client Hints获取。

2. 主流浏览器User Agent格式详解

2.1 Chrome浏览器UA结构

桌面版Chrome的典型UA字符串:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36

移动版Chrome则带有Mobile标识:

Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36

关键特征:

  • 包含AppleWebKit引擎版本
  • 使用KHTML兼容标记
  • 最后会重复Safari标识

2.2 Firefox浏览器UA模式

Firefox的UA具有独特的Gecko引擎标识:

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0

移动版示例:

Mozilla/5.0 (Android 13; Mobile; rv:109.0) Gecko/115.0 Firefox/115.0

识别要点:

  • 包含 Gecko/20100101 固定字符串
  • rv: 开头的Gecko版本号
  • 明确标注Firefox品牌和版本

2.3 Safari浏览器的UA特征

Mac版Safari:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15

iOS版会标注移动设备信息:

Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1

特殊标记:

  • 包含 Version/xx.x 独立版本号
  • iOS设备会显示类似Mac OS X的系统标识
  • 移动版有 Mobile/ 硬件标识

3. 移动设备与特殊浏览器的UA模式

3.1 微信内置浏览器UA

微信内置浏览器的UA会包含MicroMessenger标识:

Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.40(0x1800282f)

关键特征:

  • 在标准iOS UA后追加MicroMessenger信息
  • 包含微信版本号(如8.0.40)
  • 可能有十六进制设备标识符

3.2 安卓WebView的UA格式

安卓应用内WebView的典型UA:

Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36

与普通Chrome移动版的区别:

  • 包含具体设备型号(如SM-G975F)
  • 可能追加应用特有标识
  • 版本号通常滞后于正式版浏览器

3.3 桌面端Edge浏览器UA

基于Chromium的Edge浏览器:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58

识别特征:

  • 末尾有Edg/版本号标记
  • 其他部分与Chrome高度相似
  • 企业版可能包含额外标识

4. 爬虫与自动化工具的UA识别

4.1 搜索引擎爬虫UA

Googlebot桌面爬虫:

Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

百度移动爬虫:

Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)

共同特点:

  • 明确声明compatible兼容性
  • 包含爬虫名称和版本
  • 提供官方信息链接

4.2 自动化测试工具UA

Selenium WebDriver:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36

Postman测试工具:

PostmanRuntime/7.29.2

识别要点:

  • 标准浏览器UA可能被复用
  • 专用工具会有独特前缀
  • 可能包含自动化测试标记

5. UA解析的实用技巧与代码示例

5.1 使用正则表达式解析UA

JavaScript示例代码:

function parseUserAgent(ua) {
  const pattern = /(?<browser>Chrome|Firefox|Safari|Edg|OPR|MSIE|Trident)\/?\s*([\d.]+)/i;
  const osPattern = /(?<os>Windows NT|Android|iPhone|Mac OS X|Linux)[\s\/;]*(?:[\d._]+)?/i;
  
  const browserMatch = ua.match(pattern);
  const osMatch = ua.match(osPattern);
  
  return {
    browser: browserMatch?.groups?.browser || 'Unknown',
    version: browserMatch?.[2] || 'Unknown',
    os: osMatch?.groups?.os || 'Unknown'
  };
}

5.2 服务端UA识别最佳实践

Node.js示例:

const express = require('express');
const app = express();

app.use((req, res, next) => {
  const ua = req.get('User-Agent');
  
  // 移动设备检测
  const isMobile = /Mobile|Android|iPhone|iPad|iPod/i.test(ua);
  
  // 爬虫检测
  const isBot = /bot|crawl|spider|slurp|baidu|google|yandex/i.test(ua);
  
  req.deviceType = isMobile ? 'mobile' : 'desktop';
  req.isBot = isBot;
  
  next();
});

app.get('/', (req, res) => {
  res.send(`Accessed from ${req.deviceType} device`);
});

5.3 现代浏览器UA削减的影响

User-Agent削减后,开发者应该:

  1. 使用Feature Detection替代UA检测
  2. 需要详细设备信息时启用Client Hints:
Accept-CH: Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform
  1. 服务端响应示例:
res.setHeader('Accept-CH', 'Sec-CH-UA, Sec-CH-UA-Mobile');
res.setHeader('Critical-CH', 'Sec-CH-UA, Sec-CH-UA-Mobile');

6. 历史UA格式与演进过程

6.1 早期浏览器UA示例

Netscape 4.0:

Mozilla/4.0 (compatible; MSIE 4.0; Windows 95)

IE 6.0典型UA:

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)

特点:

  • 简单的Mozilla版本号
  • 明确标注IE兼容模式
  • 操作系统信息较简单

6.2 现代UA的演进趋势

  1. 隐私保护:逐步减少精确设备信息
  2. 标准化:主流浏览器趋于相似格式
  3. 扩展性:通过Client Hints补充信息
  4. 冻结机制:固定某些字段值防止追踪

实际开发中建议使用专业的UA解析库,如UAParser.js、browscap等,它们会持续更新规则库以适应UA格式变化。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐