robots.txt 是站点根目录下的一个纯文本文件,二十多年来几乎每个网站都有一份,但它的规则被误读的比例高得惊人。
先说两件很多人不知道的事。
第一,它不是权限控制。 它是一份声明——你在上面说明哪些路径欢迎抓、哪些不欢迎。守规矩的爬虫会读它并照办,不守规矩的直接无视。真要挡住,得靠鉴权或者服务端拦截。
第二,它直到 2022 年 9 月才正式成为标准。 IETF 以 RFC 9309 确立了它的语法与匹配规则;在那之前的二十多年,它一直只是一份被广泛遵守的君子协定。这也是为什么各家实现至今仍有细微出入——大家是先做了二十年,才回过头把规矩写下来。
这篇只讲怎么读。想要一份可以直接抄的配置,见AI 爬虫 robots.txt 配置清单。
一、一行一行拆
User-agent: Googlebot
Disallow: /admin/
Allow: /admin/public/
User-agent: *
Disallow: /*?sort=
Disallow: /tmp/
Sitemap: https://example.com/sitemap.xml
User-agent: 开启一个分组。 到下一个 User-agent: 为止的所有规则,都属于这一组。
Disallow: 声明不希望被抓的路径前缀。 /admin/ 会匹配 /admin/、/admin/x、/admin/x/y,凡是以它开头的都算。
Allow: 在一片 Disallow 里开一个口子。 上面这份配置的意思是:/admin/ 整个别抓,但 /admin/public/ 可以。
*** 匹配任意字符。** /*?sort= 挡的是所有带 sort 参数的地址。
$ 锚定结尾。 /*.pdf$ 只挡以 .pdf 结尾的地址。* 和 $ 不在最初的协议里,是各家陆续加的扩展,RFC 9309 把它们收编成了标准的一部分。
Sitemap: 是全局指令。 它不属于任何分组,放在文件的哪个位置都一样有效。
二、三条最容易读错的规则
规则一:爬虫只读最匹配自己的那一组,读完就不看别的组了。
这是最常见的误解——很多人以为 User-agent: * 是兜底,会和自己那一组叠加。不叠加。 上面那份配置里,Googlebot 只执行第一组,第二组里的 /*?sort= 和 /tmp/ 对它完全无效。
所以如果你为某个爬虫单开了一组,就必须把通用规则在那一组里重写一遍,否则等于给它开了后门。
规则二:Allow 和 Disallow 冲突时,比的是长度不是顺序。
RFC 9309 把这条写死了:必须采用最具体的那条匹配,而「最具体」的定义是字节数最多——和它们写在文件里的先后完全没有关系。两条等价时,Allow 优先。
Disallow: /admin/ 长度是 8,Allow: /admin/public/ 长度是 15,所以 /admin/public/index.html 走的是 Allow。
规则三:Disallow 不等于不收录。
这条最反直觉。被 Disallow 的地址,如果被别的页面链到,引擎仍然可能把这个地址收进索引——它只是不去抓内容,于是搜索结果里出现一个只有网址、没有摘要的条目。
由此引出一个经典陷阱:
用
robots.txt挡住某个页面 + 页面里写noindex= 引擎永远读不到那个noindex。
因为 noindex 写在页面里,要抓下来才看得到。你在门口挂了「别进来」,然后把「别记我名字」的字条贴在了屋里。
真要不被收录,就得允许抓取,让引擎读到 noindex。 顺带一提,Google 从 2019 年 9 月起不再支持写在 robots.txt 里的 noindex: 指令,那条路已经关了。
三、还有一件事:它是公开文件
任何人在浏览器里输入 你的域名/robots.txt 都能看到全文。
所以别把敏感路径写进去当作隐藏——那不是把门关上,是把地图交出去。Disallow: /admin-secret-2019/ 这种写法,等于向所有人公告了后台地址在哪。
四、落回 GEO:AI 爬虫是另外一批 UA
这是这篇最要紧的一段。
AI 爬虫有自己一整套 User-Agent,和搜索爬虫不是同一批名字。搜索侧的老面孔之外,还有一批专门为 AI 服务的抓取器,它们和喂搜索索引的那些各走各的。
大量站点的 robots.txt 是从几年前的模板抄来的,那时候这批 UA 还不存在。于是常见两种情况:
- 误挡:一条为反爬写的宽泛规则,把 AI 爬虫一起挡在门外——等于对 AI 隐身,而你从搜索排名上完全看不出来
- 漏配:只给几个知名爬虫开了单独分组,按规则一,其余爬虫走
*那组,而那组恰好写得很紧
完整的 18 个 UA 清单和一份可以直接抄的模板,见AI 爬虫 robots.txt 配置清单。
要提醒的是,robots.txt 只管到五道关里的第二关。放行了不等于会来抓,来抓了不等于会存——整条链路见GEO 怎么做:先过搜索引擎的五道关。
常见疑问
问:Disallow 了,为什么这个地址还出现在搜索结果里?
因为 Disallow 管的是「不要抓」,不是「不要收录」。被别的页面链到时,引擎仍可能把这个地址收进索引,只是没有内容可展示,于是出现一条只有网址的结果。要真正不被收录,得允许抓取并在页面里写 noindex。
问:Allow 和 Disallow 冲突时听谁的?
听匹配路径更长的那条,和写在文件里的先后顺序无关。两条长度相同时 Allow 优先。这是 RFC 9309 明确规定的匹配规则。
**问:User-agent: * 那一组是兜底吗?**
不是。每个爬虫只执行最匹配自己的那一组,执行完就不再看其他组,规则之间不叠加。如果你为某个爬虫单开了一组,必须把通用规则在那一组里重写一遍。
问:robots.txt 能挡住不守规矩的爬虫吗?
不能。它是一份声明,靠对方自觉遵守。要真正拦住,只能用鉴权、频率限制或者服务端按 UA 与 IP 拦截。把 robots.txt 当安全措施是危险的,因为它还是一份公开文件,等于把你不想让人看的路径列了个清单。
问:挡掉 AI 爬虫,会影响搜索排名吗?
取决于挡的是谁。有些公司的搜索爬虫和 AI 爬虫是两个独立的 UA,挡掉后者通常不影响搜索收录;但也有搜索与 AI 共用一套抓取的情况,一挡就是两头都挡。所以必须按 UA 逐个确认,不能凭公司名字一刀切。
---
想知道你的 robots.txt 有没有误挡 AI 爬虫?免费诊断一次,我们会读你站点的可抓取性与收录状况并给出清单。