User-Agent完全指南:浏览器身份识别的秘密

深入了解User-Agent的工作原理、解析方法和实际应用场景

优兔GOGO
2025年10月30日
开发教程
开发工具User-Agent浏览器Web开发

🎯 什么是User-Agent?

User-Agent(用户代理,简称UA)是HTTP请求头中的一个字符串,用于向服务器标识客户端的身份信息。每次浏览器访问网站时,都会在请求头中携带User-Agent。

典型的User-Agent示例

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
│         │ │               │       │      │            │      │            │       │              │            │
│         │ │               │       │      │            │      │            │       │              └────────────── Safari版本
│         │ │               │       │      │            │      │            │       └─────────────────────────── Chrome版本
│         │ │               │       │      │            │      │            └─────────────────────────────────── Gecko兼容
│         │ │               │       │      │            │      └──────────────────────────────────────────────── KHTML兼容
│         │ │               │       │      │            └─────────────────────────────────────────────────────── WebKit版本
│         │ │               │       │      └──────────────────────────────────────────────────────────────────── CPU架构
│         │ │               │       └─────────────────────────────────────────────────────────────────────────── 64位系统
│         │ │               └─────────────────────────────────────────────────────────────────────────────────── Windows 10
│         │ └─────────────────────────────────────────────────────────────────────────────────────────────────── 兼容性标识
│         └───────────────────────────────────────────────────────────────────────────────────────────────────── Mozilla版本
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────── 始终以Mozilla开头

📚 User-Agent的组成结构

1. 产品标识符 (Product Token)

Mozilla/5.0
  • 历史遗留,几乎所有浏览器都以此开头
  • 来源于Netscape时代的兼容性需求

2. 系统信息 (System Information)

(Windows NT 10.0; Win64; x64)
(Macintosh; Intel Mac OS X 10_15_7)
(Linux; Android 13; SM-G991B)
(iPhone; CPU iPhone OS 16_0 like Mac OS X)

包含:

  • 操作系统:Windows、macOS、Linux、Android、iOS
  • 系统版本:NT 10.0(Windows 10/11)、Android 13等
  • CPU架构:x64、ARM、Intel等
  • 设备型号:手机型号(仅移动端)

3. 平台信息 (Platform)

AppleWebKit/537.36 (KHTML, like Gecko)
  • 渲染引擎:WebKit、Blink、Gecko、Trident
  • 引擎版本:537.36等

4. 浏览器信息 (Browser)

Chrome/120.0.0.0 Safari/537.36
Firefox/121.0
Edge/120.0.0.0

🚀 User-Agent的实际应用

1️⃣ 响应式内容分发

// Node.js + Express示例
app.get('/download', (req, res) => {
  const ua = req.headers['user-agent'];
  
  if (/Android/i.test(ua)) {
    res.redirect('/downloads/app-android.apk');
  } else if (/iPhone|iPad/i.test(ua)) {
    res.redirect('/downloads/app-ios.ipa');
  } else if (/Windows/i.test(ua)) {
    res.redirect('/downloads/app-windows.exe');
  } else if (/Mac/i.test(ua)) {
    res.redirect('/downloads/app-macos.dmg');
  } else {
    res.redirect('/downloads/app-linux.deb');
  }
});

2️⃣ 移动端适配

// 检测移动设备
function isMobile(userAgent) {
  return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);
}

// 重定向到移动版网站
app.use((req, res, next) => {
  if (isMobile(req.headers['user-agent']) && !req.path.startsWith('/m/')) {
    return res.redirect('/m' + req.path);
  }
  next();
});

3️⃣ 浏览器兼容性处理

// React中根据浏览器加载不同的polyfill
function getBrowserInfo(ua) {
  const isIE = /MSIE|Trident/.test(ua);
  const isEdge = /Edg/.test(ua);
  const isChrome = /Chrome/.test(ua) && !isEdge;
  const isFirefox = /Firefox/.test(ua);
  const isSafari = /Safari/.test(ua) && !isChrome && !isEdge;
  
  return { isIE, isEdge, isChrome, isFirefox, isSafari };
}

// 加载IE专用polyfill
if (getBrowserInfo(navigator.userAgent).isIE) {
  import('core-js/stable');
  import('regenerator-runtime/runtime');
}

4️⃣ 网站统计分析

// Google Analytics风格的用户统计
function trackUserInfo(ua) {
  const info = parseUserAgent(ua);
  
  analytics.track({
    browser: info.browser.name,
    browserVersion: info.browser.version,
    os: info.os.name,
    osVersion: info.os.version,
    device: info.device.type,
    timestamp: Date.now()
  });
}

5️⃣ 爬虫识别与防护

// 识别常见爬虫
function isCrawler(ua) {
  const crawlers = [
    'Googlebot', 'Bingbot', 'Slurp', 'DuckDuckBot',
    'Baiduspider', 'YandexBot', 'facebookexternalhit',
    'Twitterbot', 'LinkedInBot', 'WhatsApp'
  ];
  
  return crawlers.some(bot => ua.includes(bot));
}

// 反爬虫策略
app.use((req, res, next) => {
  const ua = req.headers['user-agent'];
  
  // 没有UA或UA异常
  if (!ua || ua.length < 10) {
    return res.status(403).json({ error: 'Invalid user agent' });
  }
  
  // 检测恶意爬虫(非搜索引擎)
  if (isSuspiciousBot(ua) && !isCrawler(ua)) {
    return res.status(403).json({ error: 'Access denied' });
  }
  
  next();
});

6️⃣ A/B测试与灰度发布

// 基于浏览器版本的特性开关
function shouldEnableNewFeature(ua) {
  const browser = parseBrowser(ua);
  
  // 只对Chrome 100+和Firefox 100+启用新特性
  if (browser.name === 'Chrome' && parseInt(browser.major) >= 100) {
    return true;
  }
  if (browser.name === 'Firefox' && parseInt(browser.major) >= 100) {
    return true;
  }
  
  return false;
}

// 前端代码
if (shouldEnableNewFeature(navigator.userAgent)) {
  enableNewFeature();
}

💻 User-Agent解析实战

JavaScript解析

// 简单解析函数
function parseUserAgent(ua) {
  const result = {
    browser: { name: '未知', version: '未知' },
    os: { name: '未知', version: '未知' },
    device: { type: '桌面' }
  };
  
  // 解析浏览器
  if (/Chrome\/(\d+)/.test(ua)) {
    result.browser.name = 'Chrome';
    result.browser.version = RegExp.$1;
  } else if (/Firefox\/(\d+)/.test(ua)) {
    result.browser.name = 'Firefox';
    result.browser.version = RegExp.$1;
  } else if (/Safari\/(\d+)/.test(ua) && !/Chrome/.test(ua)) {
    result.browser.name = 'Safari';
    result.browser.version = RegExp.$1;
  }
  
  // 解析操作系统
  if (/Windows NT (\d+\.\d+)/.test(ua)) {
    result.os.name = 'Windows';
    result.os.version = RegExp.$1;
  } else if (/Mac OS X (\d+[._]\d+)/.test(ua)) {
    result.os.name = 'macOS';
    result.os.version = RegExp.$1.replace('_', '.');
  } else if (/Android (\d+)/.test(ua)) {
    result.os.name = 'Android';
    result.os.version = RegExp.$1;
  }
  
  // 解析设备类型
  if (/Mobile|Android/i.test(ua)) {
    result.device.type = '手机';
  } else if (/iPad|Tablet/i.test(ua)) {
    result.device.type = '平板';
  }
  
  return result;
}

// 使用示例
const info = parseUserAgent(navigator.userAgent);
console.log(info);
// {
//   browser: { name: 'Chrome', version: '120' },
//   os: { name: 'Windows', version: '10.0' },
//   device: { type: '桌面' }
// }

Node.js专业库

npm install ua-parser-js
const UAParser = require('ua-parser-js');

const parser = new UAParser();
const result = parser.setUA(req.headers['user-agent']).getResult();

console.log(result);
// {
//   ua: 'Mozilla/5.0...',
//   browser: { name: 'Chrome', version: '120.0.0.0', major: '120' },
//   engine: { name: 'Blink', version: '120.0.0.0' },
//   os: { name: 'Windows', version: '10' },
//   device: { vendor: undefined, model: undefined, type: undefined },
//   cpu: { architecture: 'amd64' }
// }

Python解析

from user_agents import parse

ua_string = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
user_agent = parse(ua_string)

print(user_agent.browser.family)  # Chrome
print(user_agent.browser.version_string)  # 120.0.0
print(user_agent.os.family)  # Windows
print(user_agent.os.version_string)  # 10
print(user_agent.is_mobile)  # False
print(user_agent.is_tablet)  # False
print(user_agent.is_pc)  # True

🔧 修改和伪造User-Agent

浏览器开发者工具

Chrome DevTools示例:

1. 打开开发者工具(F12)
2. 点击右上角三点菜单
3. More tools → Network conditions
4. 取消勾选 "Use browser default"
5. 选择预设UA或自定义

JavaScript修改(客户端)

// ⚠️ 注意:只能修改navigator.userAgent的读取,无法改变HTTP请求头
Object.defineProperty(navigator, 'userAgent', {
  get: function() {
    return 'CustomBot/1.0';
  }
});

console.log(navigator.userAgent); // CustomBot/1.0
// 但HTTP请求头仍然是真实的UA

HTTP请求中修改

// Axios
axios.get('https://api.example.com', {
  headers: {
    'User-Agent': 'MyApp/1.0.0 (iPhone; iOS 16.0)'
  }
});

// Fetch
fetch('https://api.example.com', {
  headers: {
    'User-Agent': 'MyApp/1.0.0'
  }
});

// 注意:浏览器环境下无法修改User-Agent请求头(安全限制)
// 只有在Node.js等服务端环境才能修改

Puppeteer爬虫

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  
  // 设置自定义User-Agent
  await page.setUserAgent(
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +
    '(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
  );
  
  await page.goto('https://example.com');
  
  // 验证UA
  const ua = await page.evaluate(() => navigator.userAgent);
  console.log(ua);
  
  await browser.close();
})();

🎯 常见浏览器User-Agent对照表

桌面浏览器

浏览器User-Agent示例
Chrome (Windows)Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Firefox (Windows)Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Safari (macOS)Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15
Edge (Windows)Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0

移动浏览器

设备User-Agent示例
iPhone (Safari)Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1
Android (Chrome)Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36
iPadMozilla/5.0 (iPad; CPU OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1

搜索引擎爬虫

爬虫User-Agent示例
GooglebotMozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
BingbotMozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
百度蜘蛛Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)

⚠️ User-Agent的局限性与替代方案

局限性

  1. 容易伪造:客户端可以随意修改UA
  2. 不够准确:浏览器兼容性标识导致解析困难
  3. 隐私问题:暴露用户设备和系统信息
  4. 维护成本:需要不断更新解析规则

现代替代方案

1. Client Hints API

// 服务器请求特定信息
// HTTP响应头:
Accept-CH: UA-Platform, UA-Mobile, UA-Arch, UA-Model

// 客户端响应(后续请求自动携带)
Sec-CH-UA: "Chromium";v="120", "Google Chrome";v="120"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Arch: "x86"

2. Feature Detection(特性检测)

// 推荐:检测功能而非浏览器
if ('serviceWorker' in navigator) {
  // 支持Service Worker
}

if (typeof IntersectionObserver !== 'undefined') {
  // 支持Intersection Observer
}

// 使用Modernizr
if (Modernizr.webp) {
  // 支持WebP图片
}

📊 最佳实践

✅ 推荐做法

  1. 优先使用特性检测而非UA嗅探
  2. 服务端使用成熟的UA解析库(如ua-parser-js
  3. 统计分析时记录完整UA便于后续分析
  4. 爬虫识别结合UA + IP + 行为模式
  5. 适配处理根据设备能力而非设备型号

❌ 避免的做法

  1. ❌ 过度依赖UA判断(易伪造)
  2. ❌ 手写复杂的UA解析正则(维护困难)
  3. ❌ 根据UA阻止特定浏览器访问
  4. ❌ 在前端做复杂的UA判断逻辑
  5. ❌ 忽略User-Agent的隐私影响

代码示例:综合检测

// 综合检测方案
function getClientInfo(req) {
  const ua = req.headers['user-agent'];
  const hints = {
    platform: req.headers['sec-ch-ua-platform'],
    mobile: req.headers['sec-ch-ua-mobile'],
  };
  
  return {
    // 优先使用Client Hints
    isMobile: hints.mobile === '?1' || /Mobile|Android/i.test(ua),
    platform: hints.platform || detectPlatform(ua),
    // UA作为fallback
    ua: ua
  };
}

🔗 相关工具

想要快速解析或生成User-Agent?试试我们的 User-Agent在线分析工具,支持:

  • 🔍 一键解析UA字符串
  • 🎲 随机生成各种浏览器UA
  • 📱 识别设备、操作系统、浏览器信息
  • 📋 批量生成与复制

推荐阅读

  • MDN: User-Agent文档
  • Client Hints API详解
  • 浏览器指纹识别技术
  • 反爬虫策略与实践