站点运营

robots.txt 里的一行规则,可能挡住整站最该被发现的页面

robots.txt 是站点对外发布的抓取规则,写错一行就可能挡住整类页面,也可能该挡的没挡住。本文梳理常见的规则误伤、通配符与分组写法问题,以及改完规则后如何确认生效,帮你在站点运营中少踩坑。

站点运营

robots.txt 里的一行规则,可能挡住整站最该被发现的页面

robots.txt 是站点对外发布的抓取规则

robots.txt 放在站点根目录下,是蜘蛛访问任何页面之前会先读取的文件。它不控制收录,只控制抓取:允许抓的页面,蜘蛛才去看;不允许抓的页面,蜘蛛连内容都拿不到。正因为它是入口处的总闸,一行写错,影响面往往不是一两个 URL,而是一整类页面。

很多站点出问题,并不是没写 robots.txt,而是写了之后没人再回头看。规则是几个月前临时加的,屏蔽是为了测试,后来上线、改版、迁移,这段规则还留在那里。

常见的几类规则误伤

临时屏蔽忘了删

开发阶段为了防止测试环境被抓,常见做法是写上一段 Disallow: /。上线时如果只改了域名,没删这一行,整站对外就是关闭状态。蜘蛛来一次发现全站被拒,之后就会显著降低访问频率,恢复起来比屏蔽本身慢得多。

通配符和结尾符用错

robots.txt 的路径匹配是前缀匹配,不是精确匹配。写 Disallow: /search 会连带挡住 /search-about、/searching 这类同前缀的地址。想只挡某一类,通常要配合 * 通配符和 $ 结尾符使用,比如 Disallow: /*?print= 或 Disallow: /tmp$。反过来,以为加了 $ 就能精确匹配,却把带参数的正常页面也拦在外面,也是常见情况。

把静态资源目录一起屏蔽

有的站点为了省抓取量,把 /assets/、/static/、/js/ 一并屏蔽。结果是页面本身还能抓,但蜘蛛拿不到样式和脚本,无法还原页面结构,判断内容质量时容易吃亏。CSS 和 JS 文件通常不占多少抓取预算,不建议一刀切。

分组规则互相冲突

一个 User-agent 分组内可以写多条 Allow 和 Disallow。当同一条路径同时命中允许和禁止时,一般以匹配更长的那条为准,长度相同时 Allow 优先。如果分组写得随性,比如先写 Disallow: /article 又在下面写 Allow: /article/new,实际结果会和新手预期不一致。把这些规则排好序、写清注释,比事后排查省事得多。

把 Sitemap 声明写错

Sitemap 通常写在 robots.txt 末尾,需要完整的绝对地址。写成相对路径、写在被屏蔽的分组里、或者域名带上了测试参数,都可能导致蜘蛛读不到。文件本身没问题,声明写错等于没写。

robots.txt 不等于“不能被收录”

这是最容易误解的一点。被 Disallow 的 URL 只是不会被抓取,它仍然可能因为外链、历史记录等原因出现在索引里。如果一条 URL 已经进了索引,想让它退出,正确顺序是先允许抓取、再在页面上给出 noindex,等蜘蛛抓到并看到 noindex 之后才会移除。反过来,先屏蔽再指望它掉出索引,通常只会让蜘蛛永远看不到 noindex,页面就一直留在那里。

判断一条 URL 该用哪种方式处理:不想被访问,用 robots.txt;不想被收录,用 noindex;两者都用时,先确认页面能被抓到。

改规则前后的自查清单

  • 文件是否返回 200,路径是站点根目录下的 /robots.txt,而不是子目录或带参数的地址。
  • 是否有遗留的 Disallow: /,逐个分组确认,而不是只看第一段。
  • 被屏蔽的目录里,有没有正在对外提供内容的主栏目、图片库、接口返回页。
  • 通配符和结尾符是否符合预期,前缀匹配有没有误伤同前缀地址。
  • Sitemap 是否用绝对地址声明,且文件本身能正常打开。
  • 不同 UA 分组的规则是否互相矛盾,有没有写重复的分组头。

改完之后怎么确认

改完不要直接等结果。可以先用搜索引擎提供的 robots.txt 测试工具,把被屏蔽的关键 URL 逐条喂进去看判定结果;再去服务器日志里核对,规则生效后,原本频繁出现的 403 或抓取请求应当明显减少,而该抓的栏目页访问量应逐步回升。

还要留出生效时间。蜘蛛对 robots.txt 有缓存,规则改动不会立刻全网同步,尤其是原本抓取频率就比较低的站点。改完之后保持内容正常更新、内链结构稳定,让蜘蛛有理由再回来,比反复改规则更有效。