直接回答:面向 AI 搜索的 robots.txt,正确做法是默认放行、按用途分类、只精确屏蔽你确实不想给的那一类。绝大多数站点不需要拦任何爬虫;而用一条 Disallow: / 一刀切,会把检索和引用链路一起切断。

默认放行,除非你有明确理由

先说一个前提:robots.txt君子协定,靠爬虫自行遵守,没有强制力。它拦不住不守规矩的采集者,也拦不住已经部署在 CDN 层的拦截规则。

它真正的作用是表达意图:告诉守规矩的爬虫"这里欢迎你,那里请不要来"。

对一个以内容为主的站点,合理的默认姿态是放行。理由有三个:

  • 你希望内容被引用,而引用依赖检索,检索依赖抓取
  • 训练类抓取即使拦掉,也无法验证效果,收益不明确
  • 规则越多,写错的机会越大——一条写错的规则可能同时挡掉好几个爬虫

**只有当你有明确诉求时,才需要精确屏蔽。**比如站点包含内部文档、付费内容目录,或者公司对内容用途有明确规定。

爬虫要先按用途分类,再决定放不放

同样叫"AI 爬虫",职责差别很大。三类爬虫的作用范围见《AI 引用和 AI 训练是两件事》,这里只给配置结论:

类别 配置建议 原因
检索 / 索引类(OAI-SearchBotPerplexityBotGooglebotBingbot 必须放行 直接决定能否被 AI 引用
用户触发类(ChatGPT-UserPerplexity-User 放行 代表真实用户正在读你的页面
训练类(GPTBotCCBotGoogle-ExtendedBytespider 默认放行,有诉求再单独屏蔽 不影响引用,但同样无法验证收益

**判断顺序是:先问"拦掉它我会损失什么",再问"拦掉它我能得到什么"。**如果损失是确定的、收益是不确定的,就不要拦。

一份可以照抄的配置

下面这份配置可以做起点,把域名换成你自己的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 站点地图写在这里,方便爬虫一次找到
Sitemap: https://example.com/sitemap.xml

# 默认全站放行
User-agent: *
Allow: /

# 只屏蔽确实不该被索引的路径
Disallow: /search/
Disallow: /preview/

# ---- 明确放行 AI 相关爬虫 ----

# OpenAI
User-agent: GPTBot
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ChatGPT-User
Allow: /

# Anthropic
User-agent: ClaudeBot
Allow: /
User-agent: Claude-User
Allow: /

# Perplexity
User-agent: PerplexityBot
Allow: /
User-agent: Perplexity-User
Allow: /

# 传统搜索爬虫:AI 检索层常常依赖它们的索引
User-agent: Googlebot
Allow: /
User-agent: Bingbot
Allow: /

几点说明:

  • Sitemap: 是唯一写绝对地址的指令,其他规则写路径即可
  • 路径区分大小写,/Search//search/ 是两条规则
  • 每条 User-agent 后面跟的规则属于这一组,组之间要有明确的空行分隔(严格来说是靠 User-agent 行划分,空行只是可读性)
  • 想屏蔽某个爬虫,把 Allow: / 换成 Disallow: / 即可,其他组不受影响

本站的配置就是按这个思路生成的,完整内容可以直接访问 /robots.txt 对照。

五条最容易写错的规则

第一,User-agent: * 里的 Disallow: / 会误伤一大片。 通配组是所有没被单独列出的爬虫的默认行为。你只想屏蔽某个采集者,却让几十个爬虫一起出局,这是最常见的事故。

**第二,匹配规则是"最长匹配优先",不是"先写先算"。**同一组里有多条规则时,路径匹配最长的那条生效;长度相同时 Allow 优先。所以 Allow: /blog/Disallow: /blog/draft/ 同时存在时,草稿目录仍然会被挡住——这符合直觉,但很多人以为后面的规则会覆盖前面的。

第三,robots.txt 必须放在域名根目录。 https://example.com/robots.txt 有效,https://example.com/blog/robots.txt 对主站无效。子目录站点(比如托管在二级路径下的博客)没有独立的 robots.txt 可用。

第四,规则是路径前缀匹配,不是正则。* 是通配符、$ 表示结尾,这两个的支持比较普遍,但更复杂的表达式(比如带括号、量词的写法)各爬虫支持程度不一,不要依赖。

第五,爬虫名拼错等于没写。PerplexityBot 写成 Perplexity-BotClaudeBot 写成 Claude-Bot,规则就不会被匹配。名称大小写不敏感,但拼写必须准确。

配置写完,一定要验证

写完不验证,等于没写。三步走:

第一步,确认文件本身可访问、内容正确:

1
curl -s https://example.com/robots.txt | head -40

返回 404 或返回了 HTML,说明文件位置或服务器配置有问题。

第二步,用爬虫身份请求一个内容页,确认没有被服务器层拦住:

1
2
3
curl -s -o /dev/null -w "%{http_code}\n" \
-A "Mozilla/5.0 (compatible; OAI-SearchBot/1.0)" \
https://example.com/posts/hello/

返回 200 才算真正放行。robots.txt 允许不代表能访问——CDN 的防机器人模式、WAF 规则、限速配置都可能在这一层把请求挡下来。

**第三步,过一段时间回来看日志。**只有日志里出现真实的爬虫访问,才说明整条链路是通的:

1
2
3
# 统计最近访问过的 AI 爬虫与次数
grep -ioE "GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|PerplexityBot|Bytespider" \
/var/log/nginx/access.log | sort | uniq -c | sort -rn

如果某个爬虫一次都没出现,回到第一步重新验证,别急着改内容。

常见问题(FAQ)

不写 robots.txt 会怎样?

等同于默认全部允许。搜索引擎和多数 AI 爬虫在没有该文件时按"可以抓取"处理。所以不写文件本身没有风险,但你会失去表达意图的能力——比如声明站点地图、屏蔽搜索结果页这类不该被索引的地址。

我想屏蔽 AI 训练,应该只加一条 Disallow: GPTBot 吗?

只针对你想屏蔽的对象配置,别用通配规则。需要注意训练语料来源不止一家:CCBot(Common Crawl)的数据常被多个模型复用,屏蔽了 OpenAI 却放行 CCBot,内容仍可能间接进入训练集。如果你的诉求是"尽量不被用于训练",需要把这一类别里的主要爬虫逐条列出。

robots.txt 能阻止内容被抓取吗?

只能阻止愿意遵守规则的爬虫。它没有技术强制力,对不守规矩的采集者无效。如果你的诉求是"技术上不被抓",需要靠服务器层的鉴权、频次限制或访问控制,而那些手段同样会影响正常读者和搜索引擎。

改了 robots.txt 多久生效?

爬虫通常会在下次抓取时重新读取该文件,时间从几小时到几天不等。如果之前已经被屏蔽,恢复抓取往往还需要额外几周——这也是不要随意屏蔽的原因:一次误操作的成本可能是一个月。

小结

  • 默认放行、按用途分类、只精确屏蔽必要的对象,是稳妥的默认姿态。
  • 检索类爬虫直接决定能否被引用,用户触发类代表真实读者,这两类都别拦。
  • 通配组里的 Disallow: / 是误伤重灾区,精确屏蔽优于一刀切。
  • 规则是路径前缀匹配、最长匹配优先,且必须放在域名根目录。
  • 写完必须验证:文件可访问、爬虫 UA 能拿到 200、日志里能看到真实访问。

如果你的 robots.txt 配置完还是不见爬虫来,欢迎到留言板贴出配置和日志片段,一起看看卡在哪一层。

站内搜索

没有找到内容!