robots.txt 是站点给爬虫的第一份说明,也是最少被翻看的文件之一。很多站点从上线那天起就没再动过它,直到某天发现栏目页一直不被抓取,或者后台目录反复出现在日志里。它的改动成本极低,一行字符就能改变整站的抓取范围,所以值得定期拿出来对一遍。
先确认它真的能被读到
规则写得再对,读不到也没用。检查这几项:
- 位置在域名根目录,路径是 /robots.txt,不能放在子目录里代替。
- 直接访问返回 200。如果被 301 或 302 跳到别处,部分爬虫不会继续跟随,等于没有这份文件。
- 返回内容必须是纯文本。配置失误时常见的情况是返回了一整页 HTML 报错页,爬虫读到的是标签而不是规则。
- 没有被 CDN 或反向代理长期缓存。改完规则后如果缓存没刷新,蜘蛛拿到的还是旧版本。
- 文件开头没有多余的 BOM 字符或空行导致的解析异常。
三类最容易出事的写法
测试站规则被带到了正式站
开发阶段为了防止测试环境被抓,通常会写 Disallow: /。上线时忘了删掉这一行,整站就等于关上了门。这类问题往往几天甚至几周后才被察觉,因为访客访问一切正常,只有日志里安静得反常。
顺手挡掉了 CSS、JS 和图片
有人为了节省抓取量,把 /css/、/js/、/images/ 一并挡掉。结果搜索引擎无法正常渲染页面,判断内容质量时看到的是一个没有样式的骨架;图片资源也可能因此进不了图片搜索。除非你有明确的理由,否则这些目录建议保持放行。
把 Disallow 当成 noindex 用
这是最常见的误解。被 robots.txt 挡住的页面,抓取被禁止,但它仍然可能出现在搜索结果里——因为外部链接可以暴露这个地址,爬虫虽然不能读内容,却知道它存在。反过来,如果你想让页面彻底退出索引,应该使用 noindex,而 noindex 的页面不能同时被 robots.txt 挡住,否则爬虫看不到那个标签,指令就落空了。两者要配合,不要互相遮挡。
规则细节里的坑
- User-agent 分组要分开写。想对多个爬虫生效,就写多段配置,不要在一行里塞多个名称。
- Allow 和 Disallow 冲突时按最长匹配判断。路径更具体的那条生效;长度相同时 Allow 优先。用这个特性可以做“挡整个目录、放行其中一个子路径”的操作。
- 通配符不要滥用。* 代表任意字符,$ 表示结尾锚定。写 /*.pdf$ 和写 /*.pdf 的含义并不一样,前者只匹配以 .pdf 结尾的地址。
- 一行只写一条规则。同一行里用空格隔开多条路径,通常只有第一条被识别。
- 注释用 #。用 // 开头的写法不被支持。
- Crawl-delay 基本已经无效。主流搜索引擎不再支持这个指令,想控制抓取节奏应改从服务器响应速度和站点结构入手。
- 路径区分大小写。写 /Admin/ 不一定挡得住 /admin/。
不建议写进去的内容
robots.txt 是公开文件,任何人都能访问。把后台入口、临时上传目录、备份文件命名规则写进去,相当于给扫描工具递了一份地图。
robots.txt 是“请求不要抓取”,不是访问控制。真正需要保护的目录,应该用登录验证、IP 限制或者干脆不放在公网可访问的位置。
站点地图的地址可以写在这里,方便爬虫发现,这是它少数值得保留的附加用途。
改完之后的验证步骤
- 用命令行或浏览器直接取回文件,确认返回内容和本地一致,状态码是 200。
- 抽查几条关键路径:首页、主要栏目、一篇详情页、CSS 目录、图片目录,逐条确认放行或拦截符合预期。
- 如果站点有搜索引擎提供的抓取测试工具,可以用它模拟一次读取,看规则是否按设想解析。
- 改动后观察几天访问日志,重点看原本被挡的目录是否重新出现抓取记录,或者不该被抓的地址是否终于安静下来。
- 保留一份改动前的版本,并记下修改时间。规则出问题时,回滚比逐条排查快得多。
把 robots.txt 纳入到例行检查里,和站点地图、重定向、404 一起看,能省下不少事后排查的时间。它不需要经常改,但每次改动都值得多看一眼。