| 名称 | 类型 | 平台 | User-Agent(点击复制) |
|---|
常用 User-Agent 大全收录了 241 条*真实场景中会遇到的 User-Agent 字符串,覆盖桌面浏览器、移动设备、平板设备、搜索引擎、社交爬虫、AI 爬虫、SEO 工具、HTTP 客户端、内嵌 WebView、智能设备、邮件客户端、监控与自动化共 *12 个分类。
iPhone、Googlebot、Android 14、内嵌。支持空格分隔多个关键词(同时满足)。表格区高度固定 400px,内容超出时在区域内滚动,表头会吸顶固定。
User-Agent(简称 UA) 是 HTTP 请求头中的一个字段,用来告诉服务器「我是谁」——用什么浏览器、什么操作系统、什么设备在访问。
一个最简的 UA 长这样:
User-Agent: curl/8.11.0
而浏览器发出来的,通常是这样一条长字符串:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
| 片段 | 含义 |
|---|---|
Mozilla/5.0 | 历史遗留的「我是浏览器」声明,今天几乎所有浏览器都带着它 |
(Windows NT 10.0; Win64; x64) | 平台信息:操作系统版本与 CPU 架构 |
AppleWebKit/537.36 | 渲染引擎内核(WebKit 系) |
(KHTML, like Gecko) | 兼容性声明,最早由 Safari 沿用自 KHTML/Gecko |
Chrome/131.0.0.0 | 浏览器真实身份与版本 |
Safari/537.36 | 兼容性声明,因为 Chrome 最初基于 WebKit 开发 |
可以看到,这条 UA 里同时出现了 Mozilla、AppleWebKit、KHTML、Gecko、Chrome、Safari 六个名字,但实际使用者只是 Chrome。这正是 UA 最反直觉的地方:它的大部分内容都是历史包袱和兼容性伪装,不是事实描述。
根源要追溯到 1990 年代的浏览器大战:
Mozilla,没有就只返回简陋页面。于是 Netscape 自己用了 Mozilla/1.0、Mozilla/2.0……Mozilla/4.0 (compatible; MSIE 6.0; ...),同时用 MSIE 标识自己。Mozilla/5.0 (…) Gecko/20100101 Firefox/x.y。AppleWebKit、Safari 的代码,又把这两个名字加进 UA。结果就是每出现一次新的「UA 检测」,后来者就得在 UA 里多塞一个名字。层层叠加到今天就变成了这条又长又矛盾的字符串。
| 用途 | 说明 |
|---|---|
| 服务端适配 | 判断移动端 / 桌面端,返回不同模板或跳转到 m 站 |
| 统计分析 | 统计浏览器、系统、设备占比,指导兼容性投入 |
| 反爬与风控 | 识别爬虫、异常客户端,做限流或拦截 |
| 调试与测试 | 模拟特定设备访问,验证兼容性问题 |
| 内容协商 | 给不同客户端返回不同格式的资源 |
UA 是一个完全由客户端自由填写的字符串,服务器无法验证真伪。这意味着:
curl 加一个 -A 参数就能伪装成任意浏览器所以:
永远不要用 UA 做安全判断的唯一依据。 权限控制要靠登录态与令牌,UA 只能用来做「体验优化」(比如决定给不给移动端布局)和「统计参考」。
还有一个容易踩的坑:UA 是浏览器的禁用请求头。用 JavaScript 的 fetch 或 XMLHttpRequest 是无法自定义 User-Agent 的,navigator.userAgent 也是只读的。想在浏览器里改 UA,只能通过开发者工具的设备模拟、浏览器扩展,或启动参数。
因为 UA 携带的信息越来越多(精确到系统小版本、设备型号),成了浏览器指纹追踪的重要来源。Chrome 从 2022 年起推行 UA 缩减(User-Agent Reduction):
| 缩减项 | 变化 |
|---|---|
| Chrome 版本 | 只保留主版本号,后面统一补 0.0.0,如 Chrome/131.0.0.0 |
| Windows 版本 | 统一写成 Windows NT 10.0,不再区分 Win10 / Win11 |
| macOS 版本 | 统一写成 Mac OS X 10_15_7 |
| Android 设备型号 | 从 Chrome 110 起替换为固定的 K,变成 (Linux; Android 10; K) |
| CPU 架构 | 统一为 x86_64,不再区分 Intel 与 Apple Silicon |
作为替代,Chrome 引入了 User-Agent Client Hints(UA-CH),通过一组独立请求头按需提供信息:
Sec-CH-UA: "Chromium";v="131", "Not_A Brand";v="24"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Full-Version-List: "Chromium";v="131.0.6778.86", ...
它的好处是服务端必须先通过 Accept-CH 响应头声明需要哪些信息,浏览器才会在后续请求里带上,默认不暴露,隐私更可控。
需要留意的两点:
标准爬虫会遵守 robots.txt。针对 AI 抓取,常见的写法是逐条声明:
User-agent: GPTBot
Disallow: /
User-agent: ClaudeBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: Bytespider
Disallow: /
注意 Google-Extended 和 Applebot-Extended 比较特殊——它们不是独立的爬虫,而是控制 Google / Apple 的 AI 训练能否使用你内容的开关,实际抓取仍由 Googlebot / Applebot 完成。
如果 robots.txt 不管用(总有爬虫不遵守),可以在 Nginx 用 map 做 UA 匹配拦截:
map $http_user_agent $block_ai {
default 0;
"~*(GPTBot|ClaudeBot|CCBot|Bytespider|PerplexityBot)" 1;
}
server {
if ($block_ai) {
return 403;
}
}
注意:UA 可以伪造,这种拦截只能挡住「老实」的爬虫,无法防御恶意抓取。真要防,得靠频率限制、IP 信誉、行为分析等手段组合。
iPad 从 iPadOS 13 起默认请求桌面版网页,它的 UA 是 Macintosh; Intel Mac OS X 10_15_7,和 Mac 电脑一模一样。只靠 UA 判断移动端必然误判。推荐用 CSS 媒体查询或 navigator.maxTouchPoints 辅助判断。
Chrome/9 和 Chrome/10 用字符串比较时 9 > 10。UA 里的版本号要按段拆分转成数字再比,或者直接用特性检测代替版本判断。
基于 UA 白名单的检测逻辑,遇到没见过的浏览器就会失效。能用特性检测(Feature Detection)就不要用 UA 检测,这是 Web 开发的基本原则。
(KHTML, like Gecko) 不是笔误这是历史遗留的兼容性声明,Chrome、Edge、Safari 都会带,用来通过那些检查 Gecko 内核的旧代码。看到它不代表这是 Gecko 内核。
有些脚本、扫描器、老旧客户端会完全不带 User-Agent 头。做日志分析时要把这种空值单独统计,别直接丢弃。
User-Agent 到底是什么?
为什么一条 UA 里同时出现 Mozilla、AppleWebKit、Gecko、Chrome、Safari 这么多名字?
怎么查看我自己的 User-Agent?
我能在网页里用 JavaScript 修改 User-Agent 吗?
UA 可以伪造吗?用它做安全判断可靠吗?
为什么我用 UA 判断手机端会误判?
Chrome 的 UA 里版本号为什么变成 131.0.0.0 了?
Client Hints 和 User-Agent 有什么区别?
怎么屏蔽 GPTBot、ClaudeBot 这类 AI 爬虫?
UA 里的版本号怎么正确比较?
为什么有的请求完全没有 User-Agent?
表里的 UA 可以直接拿去用吗?版本号是新的吗?