在很多站点里,robots.txt 被当成一个总开关:写进去,页面就消失。实际它只回答一个问题——蜘蛛能不能来抓这个路径。至于这些 URL 会不会出现在搜索结果里,是另一套机制在管。把这两件事分开看,很多配置上的矛盾会自己解开。
robots.txt 管的是抓取,不是收录
一条 Disallow: /private/ 的含义是“不要来抓这个目录”,而不是“不要展示这个目录”。如果站外有链接指向 /private/a.html,搜索系统仍可能仅凭链接上的锚文本,把这个地址作为一个结果摆出来,只是因为没有抓到内容,标题和摘要往往很粗糙,甚至只是一串 URL。
反过来说,真正决定“能否收录”的,是页面本身给出的信号,比如 noindex 标签、X-Robots-Tag 响应头,以及页面内容与外链的综合判断。这些信号都需要蜘蛛先抓到这个页面才能读到。抓取被挡住,信号就传不出来。
Disallow 和 noindex 一起用,会互相抵消
这是最常见的一处误配:某目录既在 robots.txt 里被屏蔽,页面头部又写着 noindex。看起来是加了两道锁,实际是第二道锁被第一道锁锁在了门外——蜘蛛进不来,自然读不到 noindex,这条指令等于没写。最后的结果可能是 URL 依然以别的方式出现在结果里,而且你连“想让它退出”的手段都失效了。
按目标选择做法
如果某个路径只是不想被反复抓取(比如临时文件、接口地址、日志目录),用 Disallow 就够了。如果目标是让某个 URL 不出现在搜索结果里,正确顺序是:先允许抓取,再让它返回 noindex;等到确认它已经从结果中退出,再考虑用 robots.txt 挡住抓取,减少无意义的请求。
Allow 与 Disallow 的匹配顺序
一个目录整体屏蔽、又要放行其中少数几个文件时,就需要依赖匹配规则。多数主流搜索引擎采用“最具体的规则优先”的思路,路径写得越长的规则越先被采纳;当两条规则长度相同时,通常 Allow 优先。不同引擎的实现细节可能有差异,写的时候留出冗余,比赌一条边界规则更稳。
- 规则尽量写到具体目录或文件名,少用一条斜杠通配整个站。
- 用了通配符和结尾符号的规则,改完之后用几组真实 URL 实际验证一遍,不要只看规则本身。
- 规则从上往下写不等于从上往下匹配,别按“后面的会覆盖前面”来设计。
这几类资源不要随手屏蔽
为了省抓取量,把静态资源目录一并屏蔽,是另一种常见操作。但蜘蛛渲染页面时需要 CSS 与 JS 才能看到完整内容,图片目录被挡住也会影响对页面的理解。省下来的一点请求,可能换来对页面判断的偏差,通常不划算。
- CSS、JS、字体、图片等渲染必需资源:保持可抓取。
- 站内搜索结果页、筛选组合页:这类路径容易组合出大量地址,按参数特征做限制更合适。
- CDN 或反向代理层另行设置的拦截:别和 robots.txt 的规则相互打架,两边都要看一眼。
一份可照着做的检查清单
- 确认 robots.txt 本身能正常返回 200;返回 404 会被当作没有限制,返回 5xx 则可能让蜘蛛转入保守状态,减少抓取。
- 逐条问:这条规则是为了省抓取,还是为了不出现在结果里?后者不该用 Disallow。
- 检查是否误伤了渲染所需的资源目录。
- 在文件里写明 Sitemap 的地址,给蜘蛛一个明确入口。
- 改完规则后翻抓取日志,看请求量、状态码和抓取路径的变化,验证是否达到预期。
robots.txt 更像是抓取入口处的交通标志,它决定蜘蛛走哪条路,但不负责把内容从结果里删掉。想做后者,得让蜘蛛进来,再听页面自己怎么说。
把这两个层面分开管理,配置会简单很多:需要减少请求的,写进 robots.txt;需要退出结果的,用 noindex 或响应头,并保证路径可被抓取。规则改动之后,用日志而不是感觉来判断效果。