robots.txt 是站点与搜索蜘蛛之间最基础的一份约定文件,但它同时也是最容易“一改就出错”的文件之一。很多站点写规则时只考虑“我要挡住哪些目录”,却忽略了通配符和前缀匹配的实际行为,结果本该被抓取的栏目入口被顺带挡掉,蜘蛛连页面都进不来,自然也就谈不上后续的 URL 发现。
前缀匹配不等于精确匹配
robots.txt 的 Disallow 按前缀匹配。写 Disallow: /search 时,被挡住的不仅是 /search,还包括 /search-guide、/searching、/search-result 这类同前缀路径。如果站点里恰好有 /search-help 这样的内容页,它就会在没有任何提示的情况下从抓取入口中消失。
需要限定某个目录时,应把路径写完整,例如 /search/,并在必要时用 $ 结尾符锁定,避免规则向无关路径扩散。
通配符常见的几类误伤
- 结尾缺 $:Disallow: /*.pdf 会顺带匹配到 /doc/report.pdf.html 这类路径,作用范围超出预期。
- 斜杠开头的通配:Disallow: /*? 会挡住所有带参数的地址,包括分页、列表筛选这些本可作为正常入口的 URL。
- 夹在路径中的通配:Disallow: /*/print 看似只挡打印页,实际会命中任意层级下含 /print 的路径,甚至影响静态目录命名。
- 变量名缩写:Disallow: /*id= 想挡内部 ID 参数,但不少正常页面也用 id 传参,容易连带被挡。
判断一条规则是否安全,最直接的方法是拿站点真实的 URL 清单去比对,而不是凭字面意思推断。
Allow 与 Disallow 的优先级
当 Allow 和 Disallow 同时命中一个 URL 时,生效的是匹配字符更长的那条;长度相同时 Allow 优先。这意味着可以用一条更具体的 Allow 把被大范围规则误伤的入口放回来,例如:
- Disallow: /tag/
- Allow: /tag/index
但要注意,Allow 只是“在 robots.txt 层面放行”,并不等于蜘蛛一定会来抓,它仍然要经过抓取调度和抓取预算的筛选。用 Allow 做补救属于治标,把规则本身写清晰才是治本。
排查与放行的操作顺序
- 从服务器日志中筛出搜索蜘蛛的请求,按状态码和路径归类,找出有内链指向却长期无抓取记录的目录。
- 逐条读 robots.txt,把每条规则在一次真实 URL 样本上跑一遍,确认命中范围。
- 确认误伤后,先缩小原规则的范围,再考虑补 Allow,避免规则越堆越乱。
- 修改后短期内观察日志中该目录的请求量是否恢复,不要指望立刻见效。
- 站点若有多个域名或子域,注意 robots.txt 按协议加域名加端口生效,别只改了一个。
和 Sitemap、内链配合
robots.txt 里可以声明 Sitemap 地址,这对 URL 发现有帮助,但前提是 Sitemap 中的 URL 本身没有被 robots.txt 挡住——两者自相矛盾时,声明反而暴露了问题。另外,Sitemap 只能补充入口,不能替代内链:一个只出现在 Sitemap 中、站内没有任何链接指向的页面,抓取频率通常明显偏低。
因此整顿顺序建议是:先修 robots.txt 的误伤规则,再补齐站内导航与相关推荐中的入口,最后检查 Sitemap 是否覆盖了这些路径,形成以内链为主、Sitemap 为辅的入口结构。
robots.txt 改动的成本很低,影响面却很大。每次编辑后都建议用日志和规则测试做一次回看,把“挡对了没有”当成固定动作,而不是等抓取量变化后才回头找原因。