站点上线后,很多人第一反应是去 robots.txt 写几行 Disallow,或者给页面加个 noindex,然后以为问题解决了。但搜索蜘蛛对不同指令的遵守方式并不一样:有的指令让它不要来抓,有的指令让它抓了但别收录,还有的只是给链接一个提示。搞混这三者,常常会出现“URL 被禁止抓取,却仍然出现在结果里”或者“想屏蔽的页面还是被访问”的情况。
Disallow 只是“别抓”,不是“别收录”
robots.txt 里的 Disallow 作用范围是抓取行为本身。蜘蛛读到这段规则后,通常不会再去请求匹配的 URL。但这里有个关键点:如果这个 URL 已经通过外链、Sitemap 或其他页面被蜘蛛发现,它仍然可能作为一个“已知地址”存在于索引判断中。因为没有抓取页面内容,蜘蛛无法读到页面里的 noindex,也无法确认页面现在长什么样。
所以,一个只靠 Disallow 屏蔽的页面,结果可能是:不抓取内容,但地址仍可能被展示,甚至标题和摘要来自外部链接的锚文本。要真正让它退出索引,通常需要先允许抓取、让蜘蛛读到 noindex,等确认生效后再考虑是否恢复 Disallow。
noindex 要能被读到才有意义
meta robots 的 noindex 和 HTTP 头里的 X-Robots-Tag 都是页面级指令,它们必须被成功抓取之后才能生效。这就带来一个很实际的顺序问题:
- 如果 robots.txt 禁止了抓取,蜘蛛读不到 noindex;
- 如果页面返回 404、503 或登录跳转,蜘蛛也可能读不到 noindex;
- 如果 noindex 只写在 JavaScript 渲染后的 DOM 里,蜘蛛不一定能等到那一步。
因此,屏蔽一个页面时,较稳妥的做法通常是:先确保页面可以被正常抓取,同时返回 noindex;确认索引状态变化后,再决定是否用 robots.txt 减少无意义的抓取。顺序反了,往往两头都不生效。
nofollow、ugc、sponsored 改的是“发现路径”
链接属性不是删除链接,它更像一个提示:这个链接是否值得蜘蛛继续走下去。nofollow 表示不保证传递权重,但蜘蛛仍可能出于发现新 URL 的目的去访问;ugc 和 sponsored 分别对应用户生成内容和付费链接,主要用于标注链接性质。
对抓取路径来说,带有这些属性的链接仍然可能被遍历,尤其在站内导航、评论区、聚合页里。它们不会自动帮你节省抓取预算,也不能当作屏蔽手段使用。真正想让某个地址不被发现,更直接的方式是去掉链接、加 noindex,或者用 robots.txt 控制抓取。
抓取节奏:Crawl-delay 与服务器承受力
robots.txt 里的 Crawl-delay 是给蜘蛛的抓取间隔建议,但不同搜索引擎的支持程度不一样。与其依赖某一条指令,不如从服务器侧观察:当蜘蛛集中访问时,响应时间是否明显变长,5xx 是否增多。如果服务器开始吃力,更有效的做法通常是优化慢查询、加缓存、限制单 IP 并发,而不是只写一个 Crawl-delay。
蜘蛛的抓取节奏,本质上是站点响应能力和内容更新频率共同作用的结果,不是一条规则就能单方面决定的。
上线前后的检查顺序
- 确认要屏蔽的 URL 当前返回什么状态码,是否可正常抓取;
- 需要退出索引的页面,优先用 noindex 或 X-Robots-Tag;
- 确实不需要被抓取的目录,再用 robots.txt 的 Disallow 减少请求;
- 检查站内链接属性,确认重要 URL 没有被 nofollow 误伤;
- 观察抓取日志里被禁止的 URL 是否还在被请求,以及 5xx 和响应时间变化。
这些指令各自解决不同层面的问题。把它们当成一套组合来用,比单独依赖某一个规则更接近实际效果。上线后定期回看抓取日志和索引状态,才能知道蜘蛛到底走了哪条路。