搜索抓取

robots.txt 与 Sitemap 声明冲突:抓取入口被误封的核对顺序

Sitemap 中已提交的 URL 被 robots.txt 规则拦掉,是抓取入口丢失的常见原因。本文梳理两份文件的职责边界、几种典型冲突形态,并给出一套从规则匹配、Sitemap 声明核对到日志验证的排查顺序,帮助站点找回被误封的抓取路径。

搜索抓取

robots.txt 与 Sitemap 声明冲突:抓取入口被误封的核对顺序

站点同时用 robots.txt 和 Sitemap 约束抓取入口时,两份文件如果各说各话,就会出现“页面在 Sitemap 里提交了、却在 robots 里被挡掉”的情况。这类冲突不会报错,也不会在站点地图报告里直接点出来,往往要等到日志里发现某些目录长期没有蜘蛛请求,才会回头核对。

先分清两份文件的职责

robots.txt 管的是能不能抓,Sitemap 管的是有哪些 URL 值得发现。前者是门槛,后者是清单。门槛把清单里的地址拦住了,清单本身不会失效,但那份清单对抓取就没有实际意义了。核对时要把两份文件放在一起看,而不是各自检查格式是否合法。

常见的冲突形态

  • Disallow 覆盖了 Sitemap 提交的目录。例如 Sitemap 收录了 /tag/ 下的全部列表页,robots.txt 却写了 Disallow: /tag/,两条规则同时生效,入口自然进不去。
  • Allow 与 Disallow 顺序写反。规则按最长匹配优先判定,长度相同时按先出现的为准。把 Allow 写在后面、路径又更短,实际生效的往往还是 Disallow。
  • 通配符与结尾锚点误伤。写成 Disallow: /*? 或 Disallow: /*.pdf$ 这类规则时,很容易连带挡掉正常的列表页和内容页。
  • robots.txt 中的 Sitemap 行指错地址。写成了测试域名、http 版或已经不存在的路径,蜘蛛顺着这行拿不到清单,等于白白浪费一条发现通道。
  • 多协议、多子域各自为政。https 与 http、主域与 www 各自有一份 robots.txt,内容还不一样,抓取行为就会随入口不同而不同。

核对顺序

  1. 用蜘蛛的 User-Agent 抓取 robots.txt 原始内容,确认返回 200、内容类型正确,没有被 CDN 或 WAF 换成验证页。
  2. 从 Sitemap 里挑几个典型 URL,按 robots.txt 的规则逐条手动匹配一遍,看最终结论是允许还是拒绝。
  3. 检查规则顺序,把允许优先的规则放在更靠前的位置,并确认没有多余的通配符。
  4. 核对 Sitemap 行指向的地址,与浏览器地址栏里的实际域名、协议保持一致。
  5. 把各协议、各子域的 robots.txt 拉出来对比一遍,找出内容不一致的那几份。

用日志做二次验证

规则改完之后,光看文件对不对还不够,要回到服务器日志里确认。重点看两类记录:一是蜘蛛对 robots.txt 本身的请求频率和返回码,二是那些原本应该被抓取的目录,最近有没有出现请求记录。如果 robots.txt 每天被反复请求,而目标目录依然空白,说明拦住的可能不是 robots 规则,而是别的原因,比如内链压根没指向过去。

robots.txt 里的 Disallow 只影响抓取,不影响收录移除。想让已经收录的页面退出,需要的是 noindex 或其它手段,别指望加一行 Disallow 就能顶替。

修正之后怎么观察

调整后不用急着下结论。先确认文件语法没有低级错误,再留一段观察期,看日志里目标路径的请求量是否逐步出现。同时留意 Sitemap 的提交状态,避免清单长期停留在旧版本。若几周后仍无变化,优先回头检查内链结构,而不是继续改 robots.txt。

这类问题的特点是隐蔽:文件都合法,冲突却实实在在。把两份文件放在同一张表里对照,通常比单独检查格式能更快定位。