发现和抓取是两件事
URL 发现解决的是“搜索引擎知道这个地址存在”,抓取解决的是“实际把内容取回去”。robots.txt 里的 Disallow 管的是后者。一个地址被 Disallow 挡住,并不等于它不会被发现——站外链接、站点地图、其他页面的引用,都可能让它的地址进入已知列表,只是它多半会停留在“知道但没取”的状态。
所以 robots.txt 不是隐藏文件的开关,更像是给抓取行为划的一条线。把这两件事混在一起考虑,是不少站点在早期阶段容易踩的坑。
常见误用:用 Disallow 处理重复内容
比较典型的情况是参数页、筛选页、站内搜索结果页。站长担心它们被索引,就直接在 robots.txt 里 Disallow 掉。
这里有个容易忽略的连锁反应:页面被挡住抓取后,页面内的 canonical、noindex 这些指令也不会被读到。搜索引擎只能看到“这里有个地址,但内容看不到”。至于这个地址最终会不会出现在结果里,往往不受你的规则控制。
- 想阻止被索引:允许抓取,用 noindex,必要时配合 canonical。
- 想减少抓取消耗:用 robots.txt 的 Disallow。
- 两件事都想做,通常要分两步处理,而不是指望一条规则同时解决。
Sitemap 与 robots.txt 的矛盾信号
如果 sitemap 里列出的 URL,正好落在 robots.txt 的 Disallow 范围内,等于同时发出了两个相反的信号。这不一定立刻造成严重后果,但会让发现与抓取的判断变得模糊,排查问题时也说不清到底是哪一环出了偏差。
把一条路径写进入口列表之前,先确认它是“希望被看到”还是“希望被跳过”。两种意图出现在同一处,通常说明规则该拆开了。
目录级规则容易连带挡住什么
把不该挡的资源一起挡住
写 /shop/ 这样的整目录规则时,要确认目录下是否还有 CSS、JS、图片。这些资源如果被挡,渲染出来的页面可能不完整,抓取到的内容和你肉眼看到的会有差异。
前缀匹配带来的意外覆盖
Disallow 是前缀匹配,写 /news 会同时盖住 /news 和 /newsletter。这种覆盖在目录命名比较随意的站点里尤其隐蔽,通常要等到某个栏目长期没有抓取记录才会被发现。
怎么确认边界是否写对了
- 用搜索引擎提供的 robots.txt 测试工具,逐个验证关键 URL 的匹配结果,而不是凭印象判断。
- 翻服务器日志,看被拦截的记录集中在哪些目录,属于预期内还是意外情况。
- 把 sitemap 里的 URL 抽样跑一遍规则,检查有没有自相矛盾的条目。
- 调整规则后观察一段时间,看重要栏目的抓取记录是否恢复正常。
回到 URL 发现本身
robots.txt 影响的是抓取路径,而不是“地址是否被发现”。把每条规则挡的是抓取还是索引想清楚,站点在发现、抓取、索引这三段里的问题才会变得可判断。规则写得越简单、越贴合真实目录结构,后续调整时越不容易牵连到不相干的路径。