一句话导读:robots.txt 是网站与爬虫之间的”君子协定”。它决定了搜索引擎与 AI 爬虫能看什么、不能看什么。理解它的匹配逻辑,比背下几条指令重要得多。
一、什么是 robots.txt
robots.txt(全称 Robots Exclusion Protocol,爬虫排除协议)是放置在网站根目录下的一个纯文本文件,用于向网络爬虫声明本站哪些资源可以被抓取、哪些不可以。
| 项目 | 说明 |
|---|---|
| 文件类型 | 纯文本(text/plain) |
| 文件名 | 固定为 robots.txt(区分大小写,必须全小写) |
| 放置位置 | 网站根目录,如 https://example.com/robots.txt |
| 生效范围 | 仅对该域名/协议+主机下的路径生效 |
| 协议性质 | 自愿遵守,不具备强制力 |
| 现行标准 | RFC 9309(2022 年正式标准化) |
起源:1994 年由荷兰工程师 Martijn Koster 等人提出,最初用于阻止爬虫抓取服务器上的敏感目录。此后逐渐被各大搜索引擎事实采纳,最终于 2022 年被 IETF 收录为正式建议标准 RFC 9309。
【重要认知】robots.txt 不是安全工具
它只是一份”礼貌请求”,无法阻止恶意爬虫、攻击者、普通用户访问你的页面。任何忽略该协议的程序都可以照常抓取。因此:
- 不要把私密内容的安全寄托在 robots.txt 上;
- 真正的访问控制应使用 身份认证、登录态、IP 白名单、WAF 等手段;
- robots.txt 的正确定位是 抓取预算管理与收录控制。
二、Robots.txt 的工作机制
关于状态码的关键结论:
| HTTP 状态码 | 爬虫的处理方式 | 风险提示 |
|---|---|---|
200 OK | 正常解析文件内容 | 标准情况 |
404 Not Found | 视为允许抓取全部内容 | 想”屏蔽全站”却删掉文件,反效果 |
403 Forbidden | Google 视为”允许抓取” | 不要用 403 当屏蔽手段 |
401 / 402 | Google 视为”允许抓取” | — |
429 / 5xx | 视为禁止抓取全部,稍后重试 | 服务器故障可能误封全站 |
3xx 重定向 | 跟随重定向;若指向其它主机或超限则视为禁止 | 规则会跟随到目标文件 |
【坑点预警】 很多站长想屏蔽全站,直接删除了
robots.txt。但由于服务器返回404,爬虫会认为允许抓取全部,结果适得其反。要屏蔽全站,应显式写入User-agent: *+Disallow: /。
三、文件规范:位置、命名与限制
3.1 位置:必须位于协议的”根目录”
robots.txt 的 URL 由 scheme + host + /robots.txt 组成,路径是写死的:
| 正确 ✅ | 错误 ❌ |
|---|---|
https://example.com/robots.txt | https://example.com/sub/robots.txt(子目录无效) |
http://example.com/robots.txt | https://example.com/robots.txt.bak(文件名错误) |
https://www.example.com/robots.txt | https://example.com/robots/robots.txt |
3.2 分协议 / 子域名独立
- HTTP 与 HTTPS 是两套:在
http://与https://下分别放置,互不影响。 - 每个子域名独立:
www.example.com与blog.example.com各自需要自己的文件。 - 每个端口独立:非标准端口需单独处理。
3.3 编码与体积限制
| 规范项 | 建议 |
|---|---|
| 字符编码 | UTF-8(避免 GBK 等导致乱码) |
| 大小限制 | Google 仅读取前 500 KiB(约 512 KB);超出部分被忽略 |
| 行长度 | 单行建议不超过 500 字节 |
| 大小写 | 文件名必须小写;指令名大小写不敏感,但路径区分大小写 |
四、指令语法全集
一个标准的 robots.txt 由 若干条”记录(record)” 组成。每条记录 = 一个或多个 User-agent + 若干条规则指令,记录之间用空行分隔。
# 这是一条注释:给所有爬虫的通用规则
User-agent: *
Disallow: /admin/
Allow: /admin/public/
Sitemap: https://example.com/sitemap.xml4.1 核心指令一览
| 指令 | 作用 | 示例 | 是否主流支持 |
|---|---|---|---|
User-agent | 指定该组规则作用的爬虫 | User-agent: Googlebot | ✅ 全部 |
Disallow | 禁止抓取的路径 | Disallow: /private/ | ✅ 全部 |
Allow | 允许抓取的路径(优先级高于同长度 Disallow) | Allow: /private/public/ | ✅ 主流 |
Sitemap | 声明站点地图地址 | Sitemap: https://ex.com/sitemap.xml | ✅ 主流 |
Crawl-delay | 抓取间隔秒数 | Crawl-delay: 10 | ⚠️ 部分(Bing/Yandex 支持,Google 忽略) |
Clean-param | 忽略指定 URL 参数 | Clean-param: ref / | ⚠️ 仅 Yandex |
Host | 指定主域名 | Host: example.com | ⚠️ 已基本弃用 |
Noindex | 请求不要收录(非标准) | Noindex: /page | ❌ 不要使用 |
4.2 User-agent:指定爬虫
User-agent: *—— 通配符,代表所有未被其它记录特别指定的爬虫。User-agent: Googlebot—— 精确匹配某个爬虫标识(区分大小写不敏感,但标识本身要拼对)。- 多条
User-agent可共用一个规则块:
User-agent: Googlebot
User-agent: Bingbot
Disallow: /no-index/【原理提示】 爬虫会优先匹配与自己标识最具体的一条记录;只有在没有专属记录时,才回退到
User-agent: *。因此”精确指定”的优先级高于”通配符”。
4.3 Disallow:禁止访问
Disallow: /—— 禁止抓取整站。Disallow:(留空)—— 允许抓取全部(等价于不禁止)。Disallow: /admin/—— 禁止/admin/目录及其下全部内容。- 多个
Disallow逐条累加:
User-agent: *
Disallow: /admin/
Disallow: /tmp/
Disallow: /*.pdf$4.4 Allow:精准放行
Allow 用于在 Disallow 的大范围内”开一个口子”,优先级更高:
User-agent: *
Disallow: /images/
Allow: /images/logo.png
Allow: /images/icons/4.5 通配符:* 与 $
| 符号 | 含义 | 示例 | 匹配对象 |
|---|---|---|---|
* | 匹配任意数量字符 | Disallow: /*.php | 任意以 .php 结尾的路径 |
$ | 匹配URL 结尾(锚定) | Disallow: /*.pdf$ | 精确以 .pdf 结尾 |
无 $ | 前缀匹配,向后延伸 | Disallow: /doc | /doc、/docs、/document.html 都会命中 |
【易错点】
Disallow: /tmp不会只匹配/tmp,还会匹配/tmpfoo、/tmp/bar.php。若只想限制目录,请写成Disallow: /tmp/(带斜杠)。
4.6 注释、空行与空白
#开头的内容为注释,#也可出现在行尾。- 空行用于分隔不同的记录组,不是必须,但强烈建议保留以增强可读性。
- 指令名与值之间的空格数不影响解析;但值内部的空格是路径的一部分。
五、匹配规则与优先级
理解匹配逻辑,是规范编写 robots.txt 的核心。Google 等主流引擎遵循 “最长匹配优先,其次 Allow 优先” 的算法:
匹配算法:先找出所有能被 URL 路径匹配的规则,选择**规则路径最长(最具体)**的那条;若长度相同,Allow 优先于 Disallow。
| 场景 | 规则 | 结果 |
|---|---|---|
| 具体 Allow 覆盖宽泛 Disallow | Disallow: /a/ + Allow: /a/b/ | /a/b/c 被允许 |
| 同长度冲突 | Disallow: /a/ + Allow: /a/ | 允许(Allow 胜出) |
| 前缀 vs 精确 | Disallow: /a/ + Disallow: /a/b/ | /a/b/x 命中更长的 /a/b/ |
| 通配符拓展 | Disallow: /*.js$ | 所有 .js 文件被屏蔽 |
【实践建议】 不要试图用极少的规则”覆盖所有情况”。robots.txt 不支持正则,过度依赖通配符会让规则难以维护、难以排查。
六、常见场景实战示例
6.1 屏蔽全站(慎用)
User-agent: *
Disallow: /6.2 只允许某搜索引擎,屏蔽其他所有爬虫
# 先放行目标爬虫
User-agent: Googlebot
Disallow:
# 再屏蔽其余全部
User-agent: *
Disallow: /6.3 屏蔽后台、临时目录与搜索结果页
User-agent: *
Disallow: /admin/
Disallow: /tmp/
Disallow: /search
Disallow: /*?
Disallow: /*.pdf$
Disallow: /*.json$
Sitemap: https://example.com/sitemap.xml6.4 屏蔽指定目录但放行其中的静态资源
User-agent: *
Disallow: /assets/
Allow: /assets/css/
Allow: /assets/js/
Allow: /assets/img/6.5 针对 AI 训练爬虫的声明(2024 年后的新常态)
User-agent: GPTBot
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: anthropic-ai
Disallow: /【趋势观察】 随着大模型训练与 AI 检索兴起,
GPTBot、ClaudeBot、PerplexityBot、Google-Extended、Bytespider等 UA 成为 robots.txt 的新常客。是否屏蔽,取决于你对”内容被 AI 引用”的策略。
6.6 分 UA 精细化控制
# 正常搜索引擎:完整放行
User-agent: Googlebot
User-agent: Bingbot
Disallow:
# 采集类/SEO 工具爬虫:全面屏蔽
User-agent: AhrefsBot
User-agent: SemrushBot
User-agent: MJ12bot
Disallow: /
# 其余爬虫:屏蔽敏感目录
User-agent: *
Disallow: /admin/
Disallow: /cart/七、主流搜索引擎与 AI 爬虫的支持差异
| 特性 | Bing | Baidu | Yandex | 说明 | |
|---|---|---|---|---|---|
Disallow | ✅ | ✅ | ✅ | ✅ | 全平台支持 |
Allow | ✅ | ✅ | ✅ | ✅ | Google 支持最完善 |
* 通配符 | ✅ | ✅ | ✅ | ✅ | — |
$ 锚定 | ✅ | ✅ | ⚠️ | ✅ | 百度支持有限 |
Sitemap | ✅ | ✅ | ✅ | ✅ | 建议直接放 sitemap |
Crawl-delay | ❌ 忽略 | ✅ | ⚠️ | ✅ | Google 请用 Search Console 限速 |
Clean-param | ❌ | ❌ | ❌ | ✅ | Yandex 专属 |
| 最大读取体积 | 500 KiB | 较大 | — | — | 超出不解析 |
| 大小写敏感(路径) | ✅ | ✅ | ✅ | ✅ | 路径区分大小写 |
【跨引擎建议】 若追求”一处编写、多处兼容”,请只使用最基础的
User-agent / Disallow / Allow / Sitemap四件套,避免依赖Crawl-delay、Clean-param等私有扩展。
八、robots.txt 与其他控制手段的边界
很多同学把”不想被收录”和”不想被抓取”混为一谈。二者机制完全不同:
| 手段 | 作用 | 位置 | 能否阻止收录 |
|---|---|---|---|
robots.txt | 阻止抓取 | 站点根目录文件 | ❌ 不能(仅减少抓取) |
<meta name="robots" content="noindex"> | 阻止收录 | 具体页面 <head> | ✅ 能 |
X-Robots-Tag HTTP 头 | 阻止收录(含非 HTML 文件) | 服务器响应头 | ✅ 能 |
| 登录墙 / 权限 | 阻止访问 | 应用层 | ✅ 间接 |
sitemap.xml | 主动告知页面 | 站点根目录 | 反向促进收录 |
【关键组合】 想让某页面既不收录也不被抓取,正确姿势是:先用
robots.txt放行该页(或至少不禁止),同时在该页<head>里写noindex。因为如果 robots.txt 禁止了抓取,爬虫就读不到页面上的noindex,页面可能因外部链接而仍被收录(”无摘要收录”)。
九、测试与验证方法
| 工具 | 用途 | 入口 |
|---|---|---|
| Google Search Console – Robots.txt 测试工具 | 验证规则、查看某 URL 是否被屏蔽 | Search Console → 设置 → robots.txt |
| Google Rich Results / URL 检查 | 检查单个 URL 的可抓取性 | URL Inspection |
| Bing Webmaster – Robots.txt Tester | Bing 规则验证 | Bing 站长工具 |
| 百度搜索资源平台 – robots 检测 | 百度规则验证 | 百度站长工具 |
命令行 curl | 确认状态码与内容 | curl -I https://example.com/robots.txt |
# 确认 robots.txt 返回状态码与响应类型
curl -I https://example.com/robots.txt
# 直接查看内容
curl https://example.com/robots.txt十、规范化编写最佳实践(Checklist)
- 文件位于根目录,命名为全小写
robots.txt - 使用 UTF-8 编码,单行不超过 500 字节,总体不超过 500 KiB
- 默认放一条
User-agent: *兜底记录 Disallow: /屏蔽全站前,务必确认不是误操作- 重要资源(CSS/JS/图片)不要被误屏蔽,否则影响渲染与收录
Allow用于在屏蔽目录中精准放行,注意路径越具体优先级越高- 用
$锚定精确后缀(如*.pdf$),避免前缀误伤 - 目录屏蔽带尾斜杠(
/tmp/而非/tmp) - 顶部显式声明
Sitemap,且使用绝对 URL - 记录之间用空行分隔,关键分组写注释说明用途
- 对 AI 爬虫策略(屏蔽或放行)明确表态
- 上线后用 GSC / 站长工具 验证规则命中是否符合预期
- 每隔一段时间复查:废弃目录是否已移除、UA 是否已更新
十一、常见错误与避坑
- 错误 1:想屏蔽全站,却删除/留空了 robots.txt 结果返回 404,爬虫视为”允许全部”。正确做法是写入
User-agent: *+Disallow: /。 - 错误 2:用 robots.txt 保护隐私数据 它拦不住恶意爬虫,敏感目录必须靠权限认证。
- 错误 3:把
noindex写成 robots.txt 指令Noindex:不是标准指令,主流引擎会忽略。要阻止收录,请用 meta 标签或X-Robots-Tag。 - 错误 4:路径前缀误伤
Disallow: /tmp会一并屏蔽/tmpfile、/tmp-2。应写Disallow: /tmp/。 - 错误 5:屏蔽了 CSS/JS Google 需渲染页面才能评估,屏蔽关键静态资源会导致收录质量下降。
- 错误 6:误解 Allow 优先级
Allow确实优先于同长度的Disallow,但更长的Disallow依然胜出——优先级先看”路径长度”。 - 错误 7:用
Crawl-delay对 Google 限速 Google 忽略该指令,请改用 Search Console 的抓取速率设置。
十二、FAQ 高频问题
不一定。缺失(返回 404)时爬虫默认抓取全部。但建议配置,以便管理抓取与声明 Sitemap。
不能。它只影响”抓取”。要移除已收录页面,需用 noindex 或 Google 的”移除 URL”工具。
Disallow 和 Allow 到底谁优先? 先比规则路径长度(更长者优先);长度相同则 Allow 优先。因此”具体 Allow 覆盖宽泛 Disallow”。
子域名可各自设置;子目录不能,robots.txt 只能位于根目录。
不会。robots.txt 只对爬虫生效,正常访客不受影响。
不支持。只支持 *(任意字符)与 $(结尾锚定)。
User-agent: * 吗? 语法上不报错,但后一条的行为不确定,建议只写一条兜底记录。