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 有缓存,规则改动不会立刻全网同步,尤其是原本抓取频率就比较低的站点。改完之后保持内容正常更新、内链结构稳定,让蜘蛛有理由再回来,比反复改规则更有效。