很多人把 robots.txt 当成一道门:写上 Disallow,把不想被抓的目录关掉,任务就算完成。但从抓取流程看,它还有第二重身份——蜘蛛每次访问站点前,几乎都会先来取一次这个文件,而这里恰好是声明 Sitemap 位置的固定入口。
蜘蛛为什么每次都先看 robots.txt
抓取调度在进入一个新站点,或访问一个长时间没有接触的站点时,会先请求根目录下的 /robots.txt,读取里面的规则,再决定后续怎么走。这个文件本身也有可用性要求:
- 返回 200 且内容正常,规则被读取;
- 返回 404,通常视为不限制抓取,但 Sitemap 声明也就随之丢失;
- 返回 5xx 或超时,抓取可能被整体暂缓,等下一次探测再恢复。
所以 robots.txt 不只是规则文件,也是抓取通路上的第一个检查点。让它保持稳定、体积小、响应快,往往比写一堆复杂规则更有价值。
Sitemap 声明放在哪一行
在 robots.txt 中声明 Sitemap,是让蜘蛛在不依赖内链的情况下找到 URL 入口的一种方式。写法本身很简单,但有几个细节容易被忽略:
- 必须写完整地址,包含协议和域名,例如 Sitemap: https://www.example.com/sitemap.xml;
- 字段名按惯例写作 Sitemap,路径与文件名要和实际文件一致;
- 可以声明多条,比如分片索引、不同子域或不同内容类型的站点地图;
- 不要把它写在 Disallow 覆盖的路径下,否则声明与规则会互相打架。
如果站点已经有 sitemap 索引文件,优先声明索引,而不是把几十个分片全部罗列进来。索引文件本身就是为“入口唯一、分片清晰”准备的。
别把入口挡在门外
常见的误配是规则范围过大。比如先写了 Disallow: / 做临时维护,之后只放行了首页,却忘了站点地图文件和静态资源目录;又比如用通配符把所有 .xml 一并挡掉。结果蜘蛛读到了 Sitemap 声明,却取不到对应的文件。
还有一种情况是 robots.txt 把自己也挡住了:规则命中了 /robots.txt 本身,抓取端既拿不到规则,也无法确认站点地图在哪。
声明只是入口,抓取还要看别的
把 Sitemap 写进 robots.txt,解决的是“告诉蜘蛛去哪儿找 URL”,并不解决“蜘蛛愿不愿意抓这些 URL”。真正影响抓取分配的仍然是:
- 内链是否把这些 URL 接进主结构;
- 页面响应是否稳定,服务器是否频繁超时;
- URL 是否重复、参数是否泛滥;
- 站点地图里是否混入了大量低价值或已失效的地址。
一个实用做法是定期从服务器日志里筛出蜘蛛对 sitemap 中 URL 的访问记录,和站点地图条数做对比,看哪些入口被长期忽略。忽略比例高的部分,通常需要回头检查内容质量和内链结构,而不是反复修改声明。
一份简单的检查清单
- robots.txt 能正常返回 200,且不带多余的重定向跳转;
- Sitemap 声明使用绝对地址,条数与实际分片一致;
- Disallow 规则没有误伤 sitemap、robots.txt 和必要的静态资源;
- 站点地图本身不超过单文件限制,超出时用索引拆分;
- 改版或迁移后,及时更新声明里的域名与路径。
robots.txt 的价值在于稳定地说明规则和入口,而不在于规则写得多复杂。语法越简单、越容易被解析,抓取端出错的概率就越低。
最后要提醒的是:Sitemap 声明只是一种发现路径的补充,不是收录保证。把它放对位置、保持可访问,再配合清晰的内链和稳定的服务器,URL 被发现并进入抓取队列的机会才会更顺畅。