很多站长把 robots.txt 当成一个“别收录”的开关,实际上它管的是更前面的一步:蜘蛛从哪些 URL 开始走、哪些路径不必走。规则写得清楚,抓取路径会更集中;规则写得含糊,蜘蛛可能把时间花在你并不关心的页面上,或者反过来,把渲染页面所需的资源也挡在门外。
蜘蛛读 robots.txt 的顺序
多数搜索引擎蜘蛛在抓取一个新站点、或长时间未访问的站点时,会先请求 /robots.txt,然后才把 URL 放进抓取队列。这个文件本身通常不会被索引,但它决定了后续哪些 URL 能进入队列、哪些会被直接跳过。也就是说,它影响的是“抓不抓”,而不是“收不收”。被禁止抓取的 URL 依然可能因为外链、Sitemap 或其它入口被收录,只是蜘蛛没去读内容。需要控制收录时,不要只依赖这一个文件。
规则之间怎么互相覆盖
按 UA 分组,最长匹配优先
同一份文件里可以有多个 User-agent 段落,蜘蛛只会读取与自己匹配的那一段,以及通配的星号段。写法越简单越稳妥,建议不要写太多层特殊分组。当多条规则同时命中同一个路径时,一般以匹配字符最长的那条为准,而不是以出现顺序为准。所以“先写 Disallow: /,再写 Allow: /public/”这种写法,通常能让 /public/ 下的页面保持可抓取,前提是 Allow 的匹配长度确实更长。
User-agent: *
Disallow: /search
Disallow: /*?sort=
Allow: /search/help
这段规则的含义是:站内搜索结果页和带排序参数的 URL 不抓,但 /search/help 这类固定帮助页保留。通配符 * 表示任意字符,$ 表示路径结尾,用好这两个符号能让规则更精确,也能避免误伤带相同前缀的正常页面。
别把渲染资源挡掉
把 /js/、/css/、/images/ 整个目录禁止抓取是常见做法,但对依赖前端渲染的站点来说,蜘蛛拿不到样式和脚本,就可能看到空页面或错乱的版面。如果这些目录里没有需要隐藏的内容,保持可抓取通常比封掉更好。真正需要屏蔽的是重复的、无价值的、会消耗抓取量的路径。
哪些路径适合挡在门外
- 站内搜索结果页、按任意关键词生成的聚合页;
- 带排序、筛选、会话 ID 等参数的 URL 变体;
- 后台、测试目录、临时上传目录;
- 重复的打印页、没有实质内容的空列表页。
这些路径往往能通过内链或参数被不断生成,蜘蛛一旦跟进去,就会在同一个模板上来回打转。把它们写进 robots.txt,等于给抓取路径做了一次收敛。
Crawl-delay 与实际抓取压力
Crawl-delay 并不是所有蜘蛛都支持的指令,主流搜索引擎大多根据自己的判断调整抓取速度,而不是严格按这个数值执行。想真正控制服务器压力,更直接的办法是让响应保持稳定、避免超时,在压力过大时返回 429 或 503,并保证恢复后能正常响应。把 Crawl-delay 写成很小的值,通常不会带来更多抓取,反而可能被忽略。服务器稳定性对抓取路径的影响,往往比这一行参数更明显。
把 Sitemap 写在这里
在 robots.txt 中声明 Sitemap 地址,是让蜘蛛顺手发现站点地图的常见方式:
Sitemap: https://example.com/sitemap.xml
它只是多给一个入口,不能替代站点地图本身的可访问性和内容质量。地图里的 URL 如果大量是重定向、404 或已被禁止抓取,蜘蛛跟过去也会很快放弃。
改完之后看什么
- 改动前先备份现有规则,避免误写 Disallow: / 造成整站不可抓取;
- 用搜索引擎提供的 robots 测试工具检查规则是否命中预期路径;
- 观察服务器日志里 robots.txt 的请求频率和抓取量的变化;
- 不要频繁来回修改,规则反复变动会让蜘蛛的抓取节奏变得不稳定。
robots.txt 不承诺收录,也不负责排名,它更像一份写给蜘蛛的路径说明。把它写清楚,让该抓的路径畅通、该绕开的路径明确,剩下的交给内容质量和内链结构去完成。