robots.txt 规则误拦排查实战指南

上线后发现文章抓取受阻,先查正式域名根目录里的 robots.txt,尤其是有没有把测试环境的 Disallow: / 一起发布。修改规则前,先分清三个目标:允许爬虫读取、阻止搜索收录、限制用户访问。它们需要不同的处理方式。

  • Disallow: 留空与 Disallow: / 含义不同,后者会匹配整个站点的路径。
  • Googlebot 有专属分组时,不会再叠加通用 User-agent: * 分组的规则。
  • "结构与语法未发现问题"只表示通过当前工具的检查,不能证明业务页面没有被误拦。

下面用 Google 搜索爬虫解释具体匹配结果;其他爬虫应按各自公开文档确认。配置中的 example.com 及目录均为演示,部署前要换成真实站点和实际路径。

空 Disallow 和斜杠到底差在哪

如果网站允许遵守该规则的爬虫抓取所有路径,可以使用:

text 复制代码
User-agent: *
Disallow:

空路径的规则不构成抓取限制。它也不是一条能覆盖同组其他禁令的"全部放行"命令;若同组另有非空 Disallow,仍需继续检查。

下列配置则相反,它要求匹配此分组的爬虫不要抓取任何路径,不要把它当作正式公开站点的默认模板

text 复制代码
User-agent: *
Disallow: /

如果部署后整站出现 robots 抓取限制,应先核对实际提供的文件。不要只检查仓库里准备发布的版本,因为域名路由、部署目录或缓存可能让访问者仍然拿到另一份内容。

屏蔽一个目录,怎样避免把相似路径一起挡住

假设网站公开文章位于 /articles/,而 /drafts/ 是不希望被抓取的草稿目录。以下示例还明确限制不带末尾斜杠的 /drafts 地址:

text 复制代码
User-agent: *
Disallow: /drafts$
Disallow: /drafts/

$ 表示地址结束。按 Google 的路径匹配方式,这组规则的推导结果如下;它不是在线工具自动返回的抓取判定:

请求路径 这组规则是否禁止抓取 原因
/drafts 匹配 /drafts$
/drafts/first-note 匹配 /drafts/ 前缀
/draftsmanship 不匹配这两条规则
/articles/first-note 不在禁止范围内
/Drafts/first-note 路径大小写不同
/drafts?sort=date 查询参数使它不再以 /drafts 结束,也不含 /drafts/ 前缀

最后一行说明,规则需要覆盖实际 URL 形态。如果站点确实存在带参数的 /drafts 页面,就要另行设计对应规则或统一该入口,不能直接宣称"草稿入口全部屏蔽"。单写 Disallow: /drafts 虽然覆盖更广,也会同时匹配 /draftsmanship 这类可能无关的地址。

路径前缀、大小写、通配符和规则优先级以 Google 的 robots.txt 解释文档 为依据。需要放行禁止目录中的例外时,例如 /drafts/public-guide,可以在同组写更具体的 Allow,但要同时列出其他实际地址验证影响范围。

Googlebot 专属分组为什么没有继承通用规则

下面这份配置乍看像是"所有爬虫避开草稿,Googlebot 额外避开内部搜索",但对 Googlebot 并非如此:

text 复制代码
User-agent: *
Disallow: /drafts/

User-agent: Googlebot
Disallow: /search/

Googlebot 选中专属组后,不与 * 组叠加,因此 /drafts/ 没有被其适用规则禁止。如果确实需要两项限制,应明确写在专属组中:

text 复制代码
User-agent: *
Disallow: /drafts/

User-agent: Googlebot
Disallow: /drafts/
Disallow: /search/

这份示例只针对带末尾斜杠的两个路径前缀。若所有爬虫的策略相同,直接用一个通用组更容易维护;只有确实需要不同规则时才拆组。

另外,同一 Google 爬虫对应多个同等匹配的专属组时,Google 会合并适用规则,不是"最后一组覆盖前面"。在线工具会保留重复组并提示,不能仅为消除提示而随意删组。上述分组行为同样见 Google 文档中的 User-agent 优先级说明

怎样在线检查现有 robots.txt

打开 robots.txt 生成与校验器,选择"粘贴并解析",将前面完整配置放进"现有 robots.txt",点击"解析并载入"。核对分组数量、每组的 User-agent、规则路径和输出文本,再处理校验提示。

它能提示规则写在 User-agent 之前、重复分组、未知指令等问题,也可复制或下载生成结果。它不会访问你的站点,不提供输入某个 URL 后自动判定允许或禁止的功能;因此仍需按规则逐条核对文章中的路径表。

看到未知指令时,先查目标爬虫是否支持。比如工具可以编辑 Crawl-delay,但 Google 不支持该字段,不能靠填写秒数来限制 Googlebot 速度。未知行可能保留在输出里,下载成功也不代表每行都会被爬虫执行。

禁止抓取后,为什么 URL 仍可能出现在搜索结果

robots.txt 管理的是抓取请求。Google 仍可能从外部链接发现被禁止抓取的 URL,并显示一个缺少正文摘要的结果;这不等于它读到了页面内容。

对可以公开访问、但不希望进入 Google 搜索结果的 HTML 页面,应让 Google 能够抓取到页面,并在页面 <head> 中设置 noindex

html 复制代码
<meta name="robots" content="noindex">

这是页面标签,不应写进 robots.txt。若先在 robots.txt 禁止该页抓取,爬虫就可能看不到新加的 noindex;也不要把调整后立即消失当成保证,处理需要重新抓取。具体要求见 Google noindex 使用说明

如果内容本来就不应公开,应使用登录认证和访问授权。不要为了让搜索爬虫看到 noindex 而公开敏感内容;robots.txt 中列出目录也不会限制普通用户访问。

发布规则后还要检查什么

将 UTF-8 纯文本文件部署到目标站点根目录的 /robots.txt。直接访问真实地址,确认看到的是规则正文,没有变成登录页面或应用首页。还要分别核对使用中的协议、子域名和端口,不能假设一份文件控制所有站点入口。

现象 优先检查 修复方向
公开文章整体被拦 是否发布了 Disallow: / 按实际目录恢复公开抓取策略
相似名字的公开目录被拦 前缀规则是否过宽 列出具体地址,缩小匹配范围
Googlebot 抓了通用组禁止的目录 是否存在专属分组 在实际生效的组中明确所需限制
设置 Crawl-delay 后 Googlebot 未按预期降速 目标爬虫是否支持 使用 Google 文档支持的抓取管理方式
校验无提示,线上仍被拦 文件部署、缓存或实际匹配是否不同 对照线上文件与目标页面的站长平台检查结果
禁止抓取后仍有搜索结果 是否混淆抓取与索引 根据公开访问要求选择 noindex 或访问控制

本文于 2026-09-11 核对 cc-tools 0.1.0 的解析与生成实现,并查阅以上 Google 一手资料。路径表属于按官方规则推导的例子,线上是否生效还需以自己站点实际提供的文件和抓取记录确认。

相关推荐
garmin Chen1 小时前
MySQL精简面试题
数据库·后端·mysql·面试
落木萧萧8251 小时前
Wrapper、Criteria、Specification:查询能不能写得好维护一点
数据库·后端·架构
步行cgn1 小时前
构造注入详解:Spring 依赖注入的首选方式
后端
吃饱了得干活1 小时前
Spring Boot + Redis 分布式锁:一个订单重复提交引发的六次迭代
java·redis·后端
步行cgn1 小时前
依赖注入详解:Spring IoC 的实现方式
后端
平头哥AI2 小时前
Day 21 _ error 是个普通值_errors.New 与 fmt.Errorf 造出来,沿调用栈抛到 main 接住
后端·学习·golang·go
写后端的胖头鱼2 小时前
一文讲懂JVM与调优
jvm·后端·算法·架构·jvm调优
步行cgn2 小时前
Spring Boot 指定数据来源详解
spring boot·后端·python
一个有温度的技术博主2 小时前
深入理解 Spring Boot 自动装配
java·spring boot·后端