一行通配符封掉半个站:robots.txt 通配符误伤栏目与恢复收录的 21 天
适用读者:管外贸独立站、自己动手改过 robots.txt 的开发或运营;正在 Google Search Console 里看到覆盖率报告大面积「已从网址中排除」找不到原因的人;准备给筛选参数页做封禁策略的技术负责人。
今年 7 月初,同事在给一个 B2B 外贸独立站做站内优化,为了封掉 listing 页面上的筛选参数组合(?filter=material:steel&price=20-50 这种能翻出几千个组合的 URL),在 robots.txt 里加了一行:
Disallow: /*filter*
本意是拦住带 filter 参数的 URL,结果两周之内自然流量直接腰斩,Google Analytics 里 organic sessions 从日均 3100 掉到 1400 左右。原因说破不值钱:站里有个长期给产品选型导流的栏目 /guides/filter-selection/,路径里正好含 filter 这四个字母,整条路径连同下面的子页面全被这一行通配符封掉了。这篇文章按复盘顺序把整件事拆开讲:robots.txt 通配符的真实语义、Google 和 Bing 处理 robots 变更的时延、怎么用 GSC 定位误封范围、以及逐条修正后 21 天的收录恢复时间线。
这行规则到底错在哪
先说结论:Disallow: /*filter* 匹配的是完整 URL 路径里任意位置出现的 filter 字符串,不是查询参数名。

robots.txt 的通配符只有两个,语义在 Google 的官方文档里写得很死:
| 通配符 | 语义 | 例子 |
|---|---|---|
* |
匹配任意数量的任意字符(含零个) | /*filter* 匹配路径中任何含 filter 的位置 |
$ |
匹配 URL 结尾 | /*.pdf$ 只匹配以 .pdf 结尾的路径 |
按这个语义逐个套:
/guides/filter-selection/—— 路径里含filter(在filter-selection里),命中,被封/products/steel-filter-series/—— 产品名里带 filter 的产品页,命中,被封/blog/how-to-clean-air-filter/—— 文章 slug 带 filter,命中,被封/products/list?filter=material:steel—— 这才是本来想封的,也命中
一行规则封了四个本不该封的路径。站里带 filter 字样的栏目页、产品页、博客加起来 86 个 URL,全进了 Google 的「已拦截」队列。而真正想封的筛选参数页,其实只需要写 Disallow: /*?*filter=,把匹配锚定到查询参数的开头。
更麻烦的是那行规则还多写了一个尾部 *。/*filter* 和 /*filter 在这条场景下效果一样——* 匹配零个字符也成立——但写法上传达的意图是模糊的,复查的人得先在脑子里展开一遍才能确认到底想拦什么。规则越含糊,以后越容易改出新的事故。
抓取、索引、排序:误伤是怎么一层层传导到流量的
很多文章把 robots.txt 说成「禁止收录」,这个说法不准确,也是这次事故里判断犹豫的根源。robots.txt 控制的是抓取(crawling),不是索引(indexing)。两者传导关系大概是这样:
flowchart TD
A[robots.txt 加了过宽的 Disallow] --> B[Googlebot 抓取时拒绝该路径下所有 URL]
B --> C[已收录页面被逐步移出索引<br/>站点整体质量信号下滑]
B --> D[内部链接的抓取配额被浪费<br/>正常页面的抓取频率下降]
C --> E[核心栏目页从搜索结果消失]
D --> F[新内容和更新内容收录变慢]
E --> G[自然流量下跌]
F --> G
三层链路里,robots.txt 只在第一层起作用,但它的杀伤会往后面两层漏:被封的页面如果原来有排名,排名对应的快照会在几天到几周内从索引里消失;同时爬虫的资源调度是站级共享的,路径级的封禁会让那部分抓取预算直接作废。
还有一个反直觉的点:robots.txt 封禁不传递权重,也不保留排名。有人误以为被 Disallow 的页面只是「不更新快照」,排名还在——实际不是,等 Google 把页面从索引移除(在覆盖率报告里通常显示为「已从网址中排除 - 由 robots.txt 屏蔽」),那个 URL 在搜索结果里就查不到了。
Google 与 Bing 的 robots 变更生效时延
改 robots.txt 不是存盘即生效。搜索引擎对 robots 文件有独立的缓存和刷新机制:
| 环节 | Bing | |
|---|---|---|
| robots.txt 缓存刷新 | 通常 24 小时内,会主动重取 | 最长 24 小时,可手动推送 |
| 新规则拦截生效 | 缓存刷新后下一个抓取周期 | 同左 |
| 解除封禁后重新抓取 | 数天到数周,取决于页面权重 | 数天到数周 |
| 完整索引恢复 | 事故后实测约 21 天 | 约 15-25 天 |
两点实操提醒。第一,Google 的 robots.txt 报告(Search Console 里能直接看到 Googlebot 最近一次成功获取的时间)是核对缓存刷新的最快途径,改动后第二天去看抓取时间戳,确认新文件已被取走,再谈后面的恢复。第二,Bing 的时延和 Google 不同步,别拿 Google 恢复了就假设 Bing 也恢复了,Bing Webmaster Tools 里的 URL 检查要单独跑一遍。
定位误封:GSC 覆盖率报告与网址检查
事故发现的过程值得记一笔。第 10 天例行看数据,发现 /guides/ 栏目流量从日均 420 掉到 60,运营第一反应是内容被竞品抄了导致排名下滑。翻 GSC 覆盖率报告才发现,「已从网址中排除」分类下多出 86 个 URL,排除原因清一色是「由 robots.txt 屏蔽」。排除原因列表支持导出,把 86 个 URL 拉到本地用脚本按路径前缀分组,5 分钟就看清了误封的边界:所有被封 URL 都含 filter 字样,且分布在 4 个互不相干的目录下——这就是通配符过宽的典型指纹。
定位阶段用了三个工具,各管一段:
- GSC 覆盖率报告:按排除原因批量拉 URL 清单,确认误封范围和数量。这里看的是 Google 已知的 URL,不等于全部误封 URL,有些从未被发现的页面不会出现在报告里。
- GSC 网址检查(URL Inspection):对可疑的单个 URL 逐个验证,能看到「网址是否在 Google 的索引中」和「是否允许抓取」两个独立状态。
/guides/filter-selection/在这里显示「已被 robots.txt 屏蔽」,实锤。 - robots.txt 测试器:Google 早年提供的在线测试器已经下线,替代做法是 GSC 的 robots.txt 报告配合本地脚本(下一节给了一个),把全站 URL 清单过一遍规则做批量预检——这个动作比逐个在界面上点省事得多。
Bing Webmaster Tools 里有现成的 robots.txt Tester(SEO Tools 菜单下),输入 URL 和 User-agent 就能看 Allow/Deny 结果,Bing 站的误封排查可以直接用它。
修正、提交与 21 天恢复时间线
改 robots.txt:对照表
修规则的时候整理了一张对照表,把常见写法的意图和实际效果摆在一起,后续团队约定改 robots 前先过一遍这张表:
| 想做的事 | 错误写法 | 正确写法 | 说明 |
|---|---|---|---|
| 封所有含 filter 的查询参数页 | Disallow: /*filter* |
Disallow: /*?*filter= |
锚定到 ? 后的参数名,不误伤路径 |
| 封特定参数值组合 | Disallow: /*filter*steel* |
Disallow: /*?*filter=*steel* |
同上,* 只在参数值内部用 |
| 只封 listing 页的排序参数 | Disallow: /*sort* |
Disallow: /*?*sort= |
sort 也可能是路径单词 |
封以 .pdf 结尾的抓取 |
Disallow: /*.pdf |
Disallow: /*.pdf$ |
$ 锚定结尾,避免误伤 .pdfviewer/ |
| 允许某子路径豁免 | 无 | Allow: /guides/$ |
Google/Bing 都支持 Allow,放行优先级高于同长度 Disallow |
修正后的 robots.txt 核心段落长这样(附带当时真正部署的版本):
# 部署环境:Nginx 1.24,robots.txt 为静态文件直接由站点根目录提供
# 团队约定:每条 Disallow 必须写行尾注释说明意图,复查时逐行核对
User-agent: *
# 封筛选参数页:锚定 ? 后的参数名 filter,后面必须跟等号
Disallow: /*?*filter=
# 封排序参数:同样锚定到参数名,避免误伤含 sort 的路径
Disallow: /*?*sort=
# 封会话追踪参数:sid 只出现在查询串
Disallow: /*?*sid=
# 多语言授权三件套:放行 hreflang 交替页与语言目录,这里不展开
Allow: /en/
Allow: /de/
Allow: /es/
Sitemap: https://www.example.com/sitemap.xml
注意 Allow: /guides/$ 这类豁免规则当时没用上——因为修正后的规则已经不再命中正常路径,加豁免反而多一层要维护的逻辑。规则写窄比写宽再打补丁好,这是这次事故里最值钱的一句教训。
用 Nginx 日志核验爬虫真实行为
GSC 报告反映的是 Google 视角,日志反映的是爬虫实际打了哪些请求,两边要对得上。核验脚本用 Nginx 默认 combined 格式的访问日志(环境:Nginx 1.24 / Ubuntu 22.04,日志路径 /var/log/nginx/access.log):
#!/bin/bash
# 用法: ./bot_check.sh /var/log/nginx/access.log
# 统计近 7 天 Googlebot 与 bingbot 抓取的 URL 分布
LOG=$1
# 提取 Googlebot 命中的 URL,按路径前缀聚合取前 20
grep -i "Googlebot" "$LOG" \
| awk '{print $7}' \
| cut -d'?' -f1 \
| cut -d'/' -f2 \
| sort | uniq -c | sort -rn | head -20
# 同样统计 bingbot,用于交叉确认 Bing 的抓取恢复进度
grep -i "bingbot" "$LOG" \
| awk '{print $7}' \
| cut -d'?' -f1 \
| cut -d'/' -f2 \
| sort | uniq -c | sort -rn | head -20
# 检查 Googlebot 是否还在请求被封前的旧参数 URL(返回码分布)
grep -i "Googlebot" "$LOG" | grep "filter=" | awk '{print $9}' | sort | uniq -c
改完规则后第三天跑这个脚本,/guides/ 目录的 Googlebot 请求数从 0 回升到每天 40 多次,说明缓存刷新生效、抓取恢复。如果日志里 Googlebot 请求数一直是 0 而规则明明已修正,优先怀疑 robots.txt 缓存未刷新,去 GSC 的 robots.txt 报告看最近一次获取时间。
主动提交与逐日恢复曲线
修正只是止损,被移出索引的 86 个 URL 不会自动秒回。恢复动作按顺序做了三步:
- 全量 URL 重新提交。把 86 个 URL 分批(每批 30 个左右)丢进 GSC 网址检查逐个「请求编入索引」,高优先级栏目页(
/guides/filter-selection/和其下 7 篇子文)优先处理。网址检查的单日配额有限,分了三天提交完。 - 更新站点地图并 ping。sitemap.xml 里补上当时新增的 3 篇指南,通过 GSC 的站点地图报告重新提交,给爬虫一个重新发现全部 URL 的入口。
- 内链补强。给被封期间排名掉光的核心页加了 4 条来自首页和热门文章的内链,加快重新抓取的调度优先级。
从修正规则当天(记为第 0 天)算起的实测时间线:
flowchart LR
subgraph S1[第 0-3 天 止损]
A[修正 Disallow 规则] --> B[确认 robots 缓存刷新<br/>日志里 Googlebot 回来了]
end
subgraph S2[第 3-10 天 重提交]
B --> C[网址检查逐个请求编入索引]
C --> D[sitemap 重新提交<br/>核心页补内链]
end
subgraph S3[第 10-21 天 回补]
D --> E[屏蔽条目清零<br/>排名与流量逐步回补]
end
S1 --> S2 --> S3
几个关键节点:第 3 天 GSC 里开始出现「已编入索引」的回升;第 10 天覆盖率报告的「由 robots.txt 屏蔽」条目清零,86 个 URL 里约四分之一回到索引;第 14 天约六成 URL 恢复,/guides/ 栏目流量回到事故前的 60%;第 21 天 86 个 URL 全部恢复,自然流量日均回到 2950 左右——离事故前的 3100 还差一点,那 150 的缺口来自 3 个低权重页面排名没有完全复原,之后又拖了两周才补齐。Bing 那边节奏类似但稍慢,第 25 天左右才算干净。
21 天这个数字别当成通用承诺,恢复速度和站点权重、被抓取频率强相关。这个站日均抓取量在 8000 次左右,算中上水平;如果站更小更冷门,时间只会更长。这也是为什么事故要早发现——每多拖一周,快照失效得越彻底,恢复越慢。
协议机制剖析:为什么搜索引擎宁可误封也不智能猜
站在搜索引擎的角度想这个问题,robots.txt 的严格匹配是刻意设计。robots 协议 1994 年就有了,比现代搜索引擎的机器学习早得多,它的价值在于可预测:站长写下一条规则,就能确定性地推算出哪些 URL 会被拦。如果 Googlebot 用语义理解去「猜」你写的 /*filter* 其实只想封参数页,猜对固然省事,猜错就是灾难——而且猜错时站长无从调试,因为没有明确的匹配规则可以对质。确定性规则的代价就是你得为语义精确负责,通配符写宽了搜索引擎不会替你兜底。
类似的机制在 410/404 处理、noindex 传播上也是同款思路:协议层给确定性行为,智能层只做辅助。理解了这一点,就知道为什么排查 robots 问题的正确姿势是拿 URL 逐个过规则,而不是凭感觉觉得「Google 应该能理解我的意图」。
趋势上多说一句:传统 SEO 管的是抓取、索引、排序这条链路,让页面在关键词查询里排上去;而生成式引擎优化(Generative Engine Optimization, GEO)管的是内容会不会被 AI 搜索引擎引用进答案。两条线的底层能力不一样——robots.txt 这类抓取层规则只属于前者,GEO 关心的是内容结构对引用的友好度。做外贸独立站两条线最终会汇合,但排障时别混在一起,先把抓取链路理顺,再谈被引用。
参考与延伸
- Google 搜索中心:robots.txt 介绍与规则语法
- Google 搜索中心:Googlebot 与抓取调控机制
- Bing Webmaster Tools 官方文档
- MDN:robots.txt 语法参考
robots.txt、通配符、Googlebot、抓取诊断、索引恢复、GSC 覆盖率、技术SEO