🎯 什么是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.36Firefox (Windows)Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0Safari (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.15Edge (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.1Android (Chrome)Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36iPadMozilla/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的局限性与替代方案局限性容易伪造:客户端可以随意修改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详解浏览器指纹识别技术反爬虫策略与实践