robots.txt 是最早被爬虫读取的文件之一,但它经常被当成万能开关:想屏蔽就写一条 Disallow,想放行就删掉一行。实际上它只负责一件事——告诉爬虫哪些路径可以抓。抓不到并不等于不会出现在搜索结果里,这一点理解错,后面很多判断都会跟着错。
它管的是抓取,不是索引
robots.txt 属于抓取层协议。被 Disallow 的 URL,爬虫通常不会去取内容,但只要别处有指向它的链接,搜索引擎仍可能把它当作一条没有摘要的结果保留下来。要阻止索引,稳妥的组合是:允许抓取,并让页面返回 noindex(meta robots 或 X-Robots-Tag)。如果页面本身被 robots.txt 挡住,爬虫看不到 noindex,这个标签也就失效了。
文件位置与生效范围
- 只对当前协议、主机和端口生效。https://www.example.com/robots.txt 管不到子域名,也管不到其它端口。
- 路径必须是根目录下的 /robots.txt,放在子目录里不生效。
- 返回 200 才按规则执行;返回 404 通常被视为没有限制;返回 5xx 时不同爬虫的处理方式不一样,与其依赖兜底,不如让服务端保持稳定。
- 内容用 UTF-8,一行一条指令,注释以 # 开头。
规则的基本结构
最外层是 User-agent 加若干条 Disallow 或 Allow,每条规则作用于它上方最近的那个 User-agent 组。
- User-agent: * 表示所有爬虫;也可以写具体名称,但名称拼错的那一组不会生效。
- Disallow: 后面留空,表示不限制任何路径。
- Disallow: / 表示屏蔽整站,这是上线测试时最常用、也最容易被遗忘的一条。
匹配顺序:更具体的优先
当 Allow 和 Disallow 同时命中一个 URL 时,主流爬虫按匹配到的字符串更长者优先来判断,长度相同时 Allow 通常优先。所以想放开某个目录下的个别文件,可以补一条更长的 Allow:
- Disallow: /admin/
- Allow: /admin/public/
这里的比较对象是匹配长度,不是书写先后,调换两行的顺序不会改变结果。
通配符与结尾符
* 匹配任意字符,$ 表示 URL 结尾,两者组合可以精确控制带参数的地址:
- Disallow: /*? 会挡住所有带查询参数的 URL,正常的内容页参数也会被一起挡掉。
- Disallow: /*?sessionid= 范围更窄,更接近真实意图。
- Disallow: /*.pdf$ 只挡 PDF,不会连带挡住 /a.pdf.html 这类地址。
几个常见误伤
- 把目录名当成前缀。Disallow: /search 会同时挡住 /search、/search-help、/search-result,写成 Disallow: /search/ 才是通常想要的边界。
- 复制模板时留下 Disallow: /,整站在抓取层被拒之门外,站内链接也无法被跟进。
- 用 robots.txt 屏蔽分页页、筛选页,结果连带挡住了这些页面上的详情链接,新 URL 的发现路径被一起切断。
- 把 robots.txt 当成临时下线开关,改完忘了删回。
和 Sitemap、频率控制的关系
robots.txt 里可以写一行 Sitemap:,给出 sitemap 或 sitemap 索引的完整地址,方便爬虫直接找到名单文件。要注意,即使某个目录被 Disallow,写在 Sitemap 里的 URL 也不会因此被放行——爬虫读到名单后仍受抓取规则约束。
Crawl-delay 是部分爬虫才支持的指令,主流搜索爬虫大多不依赖它来调节频率,服务端压力更应该通过缓存、限流和响应时间来管理。想给爬虫留余量,比较稳妥的做法是保证重要页面响应稳定,而不是赌一条延迟指令。
判断标准可以简化成一句:这条规则是让爬虫看不到某个地址,还是让搜索引擎不收这个地址。前者用 robots.txt,后者用 noindex,两者混用往往两边都做不成。
上线前的检查清单
- 直接访问 /robots.txt,确认返回 200 且内容是当前版本。
- 逐条核对 Disallow 的路径前缀,确认没有意外覆盖正常目录。
- 确认没有残留 Disallow: /。
- 检查 Sitemap 指令是否指向可访问的名单文件。
- 上线后看抓取日志:原本正常的目录如果抓取量突然归零,先怀疑 robots.txt。
robots.txt 的规则并不多,写错一次影响面却不小。把它当成一份需要版本管理的配置文件,每次改动都留记录、都验证,比事后从抓取日志里反查原因要省力得多。