开发工具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 |
| iPad | Mozilla/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示例 |
|---|---|
| Googlebot | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) |
| Bingbot | Mozilla/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的局限性与替代方案
局限性
- 容易伪造:客户端可以随意修改UA
- 不够准确:浏览器兼容性标识导致解析困难
- 隐私问题:暴露用户设备和系统信息
- 维护成本:需要不断更新解析规则
现代替代方案
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图片
}
📊 最佳实践
✅ 推荐做法
- 优先使用特性检测而非UA嗅探
- 服务端使用成熟的UA解析库(如
ua-parser-js) - 统计分析时记录完整UA便于后续分析
- 爬虫识别结合UA + IP + 行为模式
- 适配处理根据设备能力而非设备型号
❌ 避免的做法
- ❌ 过度依赖UA判断(易伪造)
- ❌ 手写复杂的UA解析正则(维护困难)
- ❌ 根据UA阻止特定浏览器访问
- ❌ 在前端做复杂的UA判断逻辑
- ❌ 忽略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详解
- 浏览器指纹识别技术
- 反爬虫策略与实践