User-Agent 完全指南:从原理到实战,浏览器标识符深度解析
全面解析 HTTP User-Agent 的组成结构、历史演变、在浏览器检测与爬虫识别中的应用,以及如何在各平台读取、修改 User-Agent,并提供常见 UA 字符串速查表。
每当你打开浏览器访问一个网站,服务器在响应你的请求之前,往往已经通过一串字符串对你的浏览器、操作系统、设备类型了如指掌。这串字符串就是 User-Agent(用户代理),它像一张无形的”身份证”,在互联网的每一次 HTTP 请求中默默传递着客户端的信息。
想立刻查看你当前浏览器的 User-Agent 详情?使用我们的 User-Agent 分析工具 一键解析所有字段。
1. 什么是 User-Agent?
User-Agent(UA) 是 HTTP 协议中的一个请求头字段,由客户端(通常是浏览器)在发起 HTTP 请求时自动附加,用于向服务器标识自身的身份信息。
1.1 UA 在 HTTP 请求中的位置
每一次 HTTP 请求都包含请求头(Headers),User-Agent 是其中的标准字段之一:
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
1.2 User-Agent 的标准定义
根据 RFC 7231(HTTP/1.1 语义与内容),User-Agent 字段的规范格式为:
User-Agent = product *( RWS ( product / comment ) )
product = token ["/" product-version]
即:一个或多个”产品/版本”标识,以及可选的注释(括在圆括号内)。
2. User-Agent 的历史演变
UA 字符串的历史充满了有趣的”兼容性博弈”,理解这段历史能帮助我们读懂那些看似奇怪的 UA 格式。
2.1 起源:Mosaic 与 Netscape(1990s)
最早的 Web 浏览器 NCSA Mosaic 使用了简单的 UA:
NCSA_Mosaic/2.0 (Windows 3.1)
1993 年,Netscape Navigator 诞生并引入了 Mozilla 这一标识(Mozilla = Mosaic + Killer):
Mozilla/1.0 (Win3.1)
当时许多服务器会检测 Mozilla,只有检测到 Mozilla 才发送高级 HTML 内容(如框架)。
2.2 兼容的代价:IE 的”假扮”(1995)
微软发布 Internet Explorer 时,为了能接收服务器的高级内容,IE 在 UA 中加入了 Mozilla 兼容声明:
Mozilla/2.0 (compatible; MSIE 3.0; Windows 95)
从此,“伪装成 Mozilla” 的传统延续至今。
2.3 渲染引擎时代(2000s)
随着 Gecko(Firefox)、WebKit(Safari)、Blink(Chrome)等渲染引擎的兴起,UA 字符串变得越来越长。每个新浏览器为了兼容各种服务端检测,都会将自己”伪装”成多种已知浏览器:
- Firefox:声称自己兼容 Mozilla 和 Gecko
- Safari:声称自己兼容 Mozilla 和 AppleWebKit
- Chrome:声称兼容 Mozilla、AppleWebKit,还加上了 Safari(!)
这就是为什么你会在 Chrome 的 UA 中同时看到 Mozilla、AppleWebKit、Chrome 和 Safari。
2.4 现代 UA 格式的确立
| 时代 | 代表浏览器 | UA 特点 |
|---|---|---|
| 1993-1995 | Mosaic、Netscape 1.x | 简短,直接标识自己 |
| 1995-2000 | IE 3-5 | 加入 Mozilla 兼容标识 |
| 2001-2008 | Firefox、Safari | 加入渲染引擎标识(Gecko、WebKit) |
| 2008-至今 | Chrome、Edge | 叠加多个兼容标识 |
3. 解剖现代 User-Agent 字符串
以 Windows 下 Chrome 浏览器的 UA 为例,逐段分析:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
3.1 字段详解
| 字段 | 值 | 含义 |
|---|---|---|
Mozilla/5.0 | Mozilla/5.0 | 历史遗留兼容标识,几乎所有现代浏览器都有 |
(Windows NT 10.0; Win64; x64) | 操作系统注释 | Windows 10,64 位系统,64 位处理器 |
AppleWebKit/537.36 | 渲染引擎 | WebKit/Blink 引擎版本 |
(KHTML, like Gecko) | 渲染引擎注释 | KHTML 兼容,类 Gecko 行为 |
Chrome/124.0.0.0 | 浏览器标识 | Chrome 浏览器,版本 124 |
Safari/537.36 | Safari 兼容标识 | 历史遗留,Chrome 基于 WebKit,与 Safari 兼容 |
3.2 Windows NT 版本号对照
| NT 版本 | Windows 系统 |
|---|---|
| Windows NT 5.1 | Windows XP |
| Windows NT 6.0 | Windows Vista |
| Windows NT 6.1 | Windows 7 |
| Windows NT 6.2 | Windows 8 |
| Windows NT 6.3 | Windows 8.1 |
| Windows NT 10.0 | Windows 10 / 11 |
3.3 移动端 UA 的差异
Android Chrome:
Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.82 Mobile Safari/537.36
iOS Safari:
Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1
移动端 UA 新增了:
- 设备型号:如
Pixel 8、iPhone - 操作系统版本:如
Android 14、iPhone OS 17_4 Mobile标识:用于区分移动端和桌面端
4. 常见 User-Agent 速查表
4.1 桌面浏览器
| 浏览器 | 典型 User-Agent |
|---|---|
| Chrome 124 (Windows) | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 |
| Firefox 125 (Windows) | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0 |
| Safari 17 (macOS) | Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15 |
| Edge 124 (Windows) | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0 |
| Opera 109 (Windows) | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 OPR/109.0.0.0 |
4.2 移动端浏览器
| 浏览器 | 典型 User-Agent |
|---|---|
| Chrome (Android) | Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.82 Mobile Safari/537.36 |
| Safari (iPhone) | Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1 |
| Samsung Internet | Mozilla/5.0 (Linux; Android 14; SM-S928B) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/25.0 Chrome/121.0.0.0 Mobile Safari/537.36 |
4.3 爬虫与机器人
| 爬虫 | 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) |
| Baiduspider | Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) |
| Python requests | python-requests/2.31.0 |
| cURL | curl/8.6.0 |
5. User-Agent 的应用场景
5.1 响应式内容分发
服务器可根据 UA 区分访问者是桌面端还是移动端,从而返回不同版本的页面:
// Node.js 示例
function detectDevice(userAgent) {
const mobileKeywords = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
return mobileKeywords.test(userAgent) ? 'mobile' : 'desktop';
}
app.get('/', (req, res) => {
const device = detectDevice(req.headers['user-agent']);
if (device === 'mobile') {
res.redirect('/mobile');
} else {
res.sendFile('desktop/index.html');
}
});
5.2 浏览器兼容性处理
前端代码中可通过 UA 检测浏览器类型,针对性地加载 Polyfill 或执行降级处理:
const ua = navigator.userAgent;
const isFirefox = ua.includes('Firefox');
const isChrome = ua.includes('Chrome') && !ua.includes('Edg');
const isEdge = ua.includes('Edg/');
const isSafari = ua.includes('Safari') && !ua.includes('Chrome');
// 针对 Safari 的特殊处理
if (isSafari) {
document.documentElement.classList.add('safari-mode');
}
⚠️ 注意:Chrome 的 UA 包含
Safari字符串,因此判断 Safari 时需排除 Chrome。
5.3 爬虫识别与反爬
网站管理员可以通过 UA 过滤恶意爬虫:
# Python Flask 示例
from flask import request, abort
ALLOWED_BOTS = ['Googlebot', 'Bingbot', 'Baiduspider']
@app.before_request
def check_user_agent():
ua = request.headers.get('User-Agent', '')
# 屏蔽可疑的空 UA 或过短的 UA
if len(ua) < 10:
abort(403)
# 允许特定已知爬虫
is_known_bot = any(bot in ua for bot in ALLOWED_BOTS)
5.4 网站统计与分析
UA 数据是网站分析工具(如 Google Analytics)的重要数据来源,可用于统计:
- 用户使用的浏览器分布
- 操作系统占比
- 桌面端 vs 移动端比例
- 设备型号分布
5.5 A/B 测试与个性化
通过设备类型区分,可以对不同终端用户展示不同的界面设计或功能:
// 仅对桌面用户展示复杂动画
const isDesktop = !/Mobi|Android/i.test(navigator.userAgent);
if (isDesktop) {
enableParticleAnimation();
}
6. 如何读取 User-Agent
6.1 在浏览器中读取
// 读取完整 UA 字符串
const ua = navigator.userAgent;
console.log(ua);
// 使用现代 API(更语义化)
const uaData = navigator.userAgentData; // Chrome 90+
console.log(await uaData.getHighEntropyValues([
'architecture', 'model', 'platform', 'platformVersion',
'fullVersionList'
]));
6.2 在服务端读取
Node.js(Express):
app.get('/', (req, res) => {
const ua = req.headers['user-agent'];
console.log('客户端 UA:', ua);
});
Python(Flask):
from flask import request
@app.route('/')
def index():
ua = request.headers.get('User-Agent')
print(f'客户端 UA: {ua}')
PHP:
<?php
$ua = $_SERVER['HTTP_USER_AGENT'];
echo "客户端 UA: " . htmlspecialchars($ua);
?>
Java(Spring):
@GetMapping("/")
public String index(@RequestHeader("User-Agent") String userAgent) {
System.out.println("客户端 UA: " + userAgent);
return "index";
}
6.3 使用开发者工具查看
- 在 Chrome 中按
F12打开 DevTools - 切换到 Network(网络) 标签页
- 刷新页面,点击任意请求
- 在 Request Headers(请求标头) 中找到
User-Agent
7. 如何修改 User-Agent
7.1 Chrome 开发者工具(临时修改)
- 打开 DevTools (
F12) - 点击右上角 ⋮ → More tools(更多工具) → Network conditions(网络状况)
- 取消勾选 Use browser default
- 在下拉菜单中选择预设设备,或输入自定义 UA
7.2 浏览器扩展
推荐扩展:
- User-Agent Switcher and Manager(Chrome/Firefox)
- User-Agent Switcher(Firefox)
7.3 命令行工具
cURL:
# 模拟 Chrome 浏览器
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" https://example.com
Python requests:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
}
response = requests.get('https://example.com', headers=headers)
Python Playwright(自动化测试):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(
user_agent='MyCustomBot/1.0'
)
page = context.new_page()
page.goto('https://example.com')
8. Client Hints:User-Agent 的未来
由于 User-Agent 字符串包含过多个人信息(可用于浏览器指纹),Google 主导推出了 User-Agent Client Hints(UA-CH) 方案,以替代传统 UA 字符串。
8.1 UA-CH 的核心理念
- 最小化原则:默认只提供最少的信息
- 主动请求:服务器须明确请求所需信息
- 隐私保护:减少被动指纹追踪
8.2 UA-CH 请求头示例
客户端默认发送:
Sec-CH-UA: "Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"
服务器如需更多信息,在响应头中声明:
Accept-CH: Sec-CH-UA-Full-Version-List, Sec-CH-UA-Arch, Sec-CH-UA-Model
客户端后续请求会携带更多字段:
Sec-CH-UA-Full-Version-List: "Chromium";v="124.0.6367.82", "Google Chrome";v="124.0.6367.82"
Sec-CH-UA-Arch: "x86"
Sec-CH-UA-Model: ""
8.3 JavaScript 中读取 UA-CH
// 读取基础信息(无需权限)
const uaData = navigator.userAgentData;
console.log(uaData.brands); // 浏览器品牌列表
console.log(uaData.mobile); // 是否移动端
console.log(uaData.platform); // 操作系统
// 读取详细信息(需要 Permissions Policy)
const highEntropyValues = await uaData.getHighEntropyValues([
'architecture',
'bitness',
'model',
'platformVersion',
'fullVersionList',
'uaFullVersion',
'wow64'
]);
console.log(highEntropyValues);
8.4 UA-CH 支持情况
| 浏览器 | 支持状态 |
|---|---|
| Chrome 90+ | ✅ 完整支持 |
| Edge 90+ | ✅ 完整支持 |
| Firefox | ❌ 尚未支持 |
| Safari | ❌ 尚未支持 |
9. UA 检测的最佳实践
9.1 优先使用特性检测
UA 检测是”用户代理嗅探”,属于非常规手段。在前端开发中,应优先使用特性检测(Feature Detection):
// ✅ 推荐:检测特性而非 UA
if ('geolocation' in navigator) {
// 支持地理位置 API
}
if (CSS.supports('display', 'grid')) {
// 支持 CSS Grid
}
// ❌ 不推荐:通过 UA 推断浏览器能力
if (navigator.userAgent.includes('Chrome')) {
// 假设 Chrome 支持某功能
}
9.2 UA 检测的适用场景
| 场景 | 推荐方案 |
|---|---|
| 功能支持判断 | 使用特性检测(Modernizr 等) |
| 移动端/桌面端区分 | 使用 CSS 媒体查询 + UA作为补充 |
| 服务端内容分发 | UA + Accept 头结合判断 |
| 统计分析 | UA 解析(结合 UA-CH) |
| 反爬虫 | UA + 行为分析 + IP 信誉 |
9.3 解析 UA 字符串的推荐库
| 语言 | 推荐库 |
|---|---|
| JavaScript | ua-parser-js、bowser、detect-browser |
| Python | user-agents(基于 ua-parser) |
| PHP | WhichBrowser/Parser |
| Java | uap-java |
| Go | mileusna/useragent |
10. 常见问题
UA 字符串可以伪造吗?
可以,且非常容易。 UA 字符串仅是客户端自我声明的字段,服务器无法验证其真实性。任何 HTTP 客户端都可以发送任意 UA 字符串。因此,UA 不能作为安全判断的唯一依据,需结合 IP 信誉、行为分析等多维度手段。
为什么所有浏览器的 UA 都有 Mozilla/5.0?
这是历史遗留问题。早期网站只向 Netscape(Mozilla)发送完整内容,其他浏览器为了兼容,纷纷在 UA 中加入 Mozilla。这一传统延续至今,几乎所有现代浏览器都以 Mozilla/5.0 开头。
navigator.userAgent 会随 UA-CH 被废弃吗?
不会立即废弃,但 Google 曾计划在 Chrome 中逐步冻结 navigator.userAgent(仅保留非常有限的信息)。目前该计划已暂停,但长期来看 UA-CH 是官方推荐方向。
如何区分真实用户和爬虫?
仅凭 UA 不可靠,建议综合以下手段:
- UA 检查:检测已知爬虫特征 UA
- 行为分析:请求频率、鼠标轨迹、JavaScript 执行能力
- IP 信誉:检查数据中心 IP、已知恶意 IP
- CAPTCHA:人机验证挑战
- Honeypot:隐藏链接陷阱
User-Agent 和 Accept 头的区别?
User-Agent 标识客户端身份(是什么软件),Accept 系列头(Accept、Accept-Language、Accept-Encoding)描述客户端能接受什么类型的内容。两者配合使用,服务器可以提供最合适的响应。
11. 在线分析工具
想要快速解析当前浏览器的 User-Agent,或者分析特定的 UA 字符串,可以使用我们的 User-Agent 分析工具,支持:
- 自动读取并展示当前浏览器 UA
- 解析浏览器名称与版本
- 识别操作系统与版本
- 判断设备类型(桌面/移动/平板)
- 识别渲染引擎信息
- 标注是否为爬虫/机器人
12. 总结
User-Agent 是 Web 生态中一个历史悠久、看似简单却内涵丰富的组件。从 1993 年 Mosaic 浏览器的简单标识,到如今 Chrome 那串包含多个引擎标记的复杂字符串,UA 的演变折射出 Web 技术的发展历程。
| 核心要点 | 建议 |
|---|---|
| UA 可被伪造 | 不要将 UA 作为唯一安全判断依据 |
| 优先特性检测 | 前端开发优先使用特性检测而非 UA 嗅探 |
| 了解 UA-CH | 关注 User-Agent Client Hints 的发展动态 |
| 使用成熟库 | 解析 UA 时使用社区维护的专业库 |
| 结合多维度 | 反爬虫场景结合 UA、行为、IP 多维判断 |
无论是前端开发、后端服务、运维监控还是网络安全,理解 User-Agent 都是 Web 开发者的必备技能。立即使用 User-Agent 分析工具 查看并解析你的浏览器信息吧!