泛解析带来的不是流量,而是无限页面与抓取预算黑洞
很多站长为了方便,会在 DNS 里配一条 *.example.com 泛解析,把所有未定义的子域名都指向同一台服务器。短期看它省事:用户输错前缀也能打开、测试环境随便起一个子域就能用。但对搜索引擎来说,这条记录等于告诉它「这个域名下有无限个可访问的主机名」。爬虫会顺着各种来源里的子域名变体去抓,抓到的却全是同一份内容,结果就是站点被抓走大量无意义的抓取配额,真正需要收录的正文页反而迟迟进不了索引。
这个问题在世面上讲得不多,因为它不像「关键词布局」那样直观,但它的破坏力是持续性的。本文按「先确认现象、再量化影响、最后收敛入口」的顺序,给出一套可以照着执行的收敛方案。
第一步:先确认你的站点是否真的存在无限入口
不要凭印象判断,直接测量。搜 site: 指令看到的结果数量是粗略的,更可靠的方式是看搜索引擎对「实际抓取的 URL」的统计,以及自己服务器日志里的 Host 头分布。
# 1) 服务器侧:统计最近日志里出现过多少个不同的 Host
awk '{print $1}' /var/log/nginx/access.log > /dev/null # 占位说明:Host 在 combined 格式中需自定义
# 更可靠的做法是使用包含 $host 的自定义日志格式,然后:
awk '{print $2}' /var/log/nginx/zz_host.log | sort | uniq -c | sort -rn | head -40
# 2) 只统计来自搜索引擎爬虫的请求,看它们抓了哪些 Host
grep -iE 'Googlebot|bingbot|Baiduspider' /var/log/nginx/access.log \
| awk '{print $NF}' | sort | uniq -c | sort -rn | head -20如果输出里出现的 Host 数量远超你真正想运营的那几个(比如你只想运营 www.example.com 和 example.com,日志里却有几十个随机前缀),那么泛解析已经在替搜索爬虫制造入口了。把这些随机 Host 复制下来,去搜索引擎里抽查两三个,如果它们能打开并且内容与主站一模一样,问题就坐实了。
第二步:量化它到底消耗了多少抓取预算
抓取预算(crawl budget)是搜索引擎分配给一个站点的抓取配额,它的分配逻辑大致是:优先抓「重要且经常更新」的 URL,同时受站点响应速度与返回状态的影响。无限子域名会从两个方向恶化这个分配:
- 把配额分流给无价值 URL。 爬虫把时间花在
a7f3.example.com这类页面上,正文页的抓取频次自然下降,更新了也不一定被及时抓。 - 拉高平均响应时间与错误率。 如果这些随机子域在你的 Nginx 里没有对应的 server_name,会被默认 server 块接走,可能返回 404、可能返回 200 但内容是首页,甚至可能因为证书不匹配返回证书错误。错误率上升会直接降低搜索引擎对该域的信任度。
这里需要补充一个很多站长误解的点:抓取预算不是一个固定数字,而是搜索引擎根据站点表现动态调整的结果。站点响应越快、返回的状态码越"干净"、内容重复度越低,爬虫愿意投入的配额就越多;反之,站点里大量 URL 指向同一份内容、或者大量返回软 404,爬虫就会主动降低来抓的频率。也就是说,泛解析造成的浪费不只是"占用了配额",而是会让搜索引擎整体低估这个站的价值——它看到的是一个内容高度重复、状态码混乱、有无限入口的站点,于是把有限的抓取能力转投到结构更清晰的竞争对手那里去。这种损失一旦形成,即使后来你把泛解析收敛掉了,站点的抓取频次回升也需要数周到数月,因为搜索引擎要重新观察你的表现才能上调配额。
还有一点值得强调:被泛解析复制出去的内容,在搜索引擎看来是"重复内容",而重复内容的处理结果通常是"只保留其中一个版本,其余全部排除"。问题在于,搜索引擎并不保证保留的是你想让它保留的那一个。如果它恰好把 random123.example.com/1234.html 当成了"正版",那么你主站上同样的页面反而会被判为重复而降低展示,用户搜索时点进来看到的是一个你不认识、也无法维护的域名。这比单纯浪费抓取配额更危险,因为它直接影响了你的品牌与流量归属。
量化方式是统计「来自爬虫的请求中,Host 不等于主站的比例」:
total=$(grep -icE 'Googlebot|bingbot' /var/log/nginx/access.log)
good=$(grep -iE 'Googlebot|bingbot' /var/log/nginx/access.log | grep -c 'www\.example\.com')
echo "爬虫总请求: $total, 主站请求: $good, 越界比例: $(( (total-good)*100/total ))%"这个比例超过 10% 就值得立刻处理,超过 30% 说明泛解析已经在主导你的抓取画像了。
第三步:收敛入口,从 DNS、Nginx、证书三处同时下手
只改一处是无效的,因为入口是三层叠加出来的。必须同时处理:
DNS 层:决定「解析到什么」。 如果确实需要泛解析(比如给客户开二级域名),不要让它指向主站。可以把它指向一个专用的空站点,或者干脆删除泛解析、改为按需添加具体子域记录。
; 删掉这条无限入口
; *.example.com. A 1.2.3.4
; BIND9 的写法示例:只保留明确需要的子域
www IN A 1.2.3.4
api IN A 1.2.3.4
; 若必须保留泛解析,指向一个不返回 200 的专用地址
; *.example.com. IN A 192.0.2.1 (TEST-NET-1,文档保留地址)Nginx 层:决定「返回什么状态」。 关键是配一个明确的默认 server 块,对未知 Host 一律返回 444 或 410,而不是把请求交给主站。同时把真正的站点绑定到具体 server_name 上,注意 Typecho、WordPress 这类程序靠 HTTP_HOST 拼绝对链接,泛域名一旦被 200 响应,程序会自动生成带随机子域的 URL,把问题放大。
# 兜底块:所有未匹配的 Host 全部断掉,不进应用
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
return 444;
}
# 真正的站点,只认这两个名字
server {
listen 443 ssl;
server_name example.com www.example.com;
# ... 正常配置
}证书层:别让随机子域也有有效证书。 如果你用通配符证书(*.example.com),它同时覆盖了所有随机子域,等于给这些页面开了 HTTPS 绿灯。这是个容易被忽略的细节:证书本身不会导致收录,但会让「随机子域返回 200」这件事变得更容易发生,因为客户端不会因为证书错误而中断。更稳的做法是给确切的子域申请具体证书(多域 SAN),而不是通配符。
# 用 acme.sh 申请指定域的证书,避免通配符覆盖随机子域
acme.sh --issue -d example.com -d www.example.com -d api.example.com \
--webroot /var/www/html
# 通配符需要 DNS 验证,且会覆盖所有子域,权衡后再用
# acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'第四步:把已经产生的垃圾 URL 请出去
收敛入口只阻止新增,已经进过索引的随机子域还需要主动处理。这里的取舍很重要:
- 这些页面返回 404 就够了吗? 不够稳。404 会让搜索引擎反复回来确认,把它拖很久。对确定永远不会恢复的 URL,410 是更强的信号,表示「已永久删除」,索引清退速度更快。
- 不要用 robots.txt 的 Disallow 来屏蔽它们。 这是最经典的错误:被 Disallow 屏蔽后爬虫无法再次访问,也就看不到 410,反而无法确认页面已消失,结果这些 URL 会长期留在索引里并显示「已抓取但被 robots.txt 屏蔽」。要清退索引,就必须允许抓取并返回 410,而不是禁止抓取。
- 用 Google Search Console 的「网址移除」做加速。 410 生效需要数周,URL Removal 工具能临时压掉,配合 410 长期生效使用效果最好。
# 在默认 server 块里,把历史遗留的随机子域明确返回 410
server {
listen 443 ssl default_server;
server_name _;
return 410; # 已永久删除,清退索引最快
}第五步:确认收敛生效,并防止复发
改完之后不要只看日志变成 410 就收工,要按下面三点确认:
- 单个随机子域返回的状态码。 用
curl -I -H "Host: random.example.com" https://1.2.3.4/直接打 IP 加 Host 头,绕过 DNS 看服务端真实返回,确认是 410/444 而不是 200。 - 证书是否仍然覆盖随机子域。
openssl s_client -connect 1.2.3.4:443 -servername random.example.com,看证书 SAN 列表里是否还有通配符。若还想彻底,就换掉通配符证书。 - GSC 里的状态变化。 观察「已编入索引」数量是否随时间下降,同时正文页的「已发现未编入索引」是否改善。这两条曲线是判断抓取预算是否回收成功的直接证据。
总结
泛解析本身不是错,错在让泛解析指向了主站并且由主站返回 200。它带来的不是额外流量,而是无限个与主站内容重复的可访问主机名,这些入口会持续吃掉抓取配额、拉低站点在搜索爬虫眼里的质量评分。处理顺序很明确:先用日志与爬虫 Host 分布确认现象,再量化越界比例判断严重程度,然后从 DNS、Nginx 默认 server、证书 SAN 三处同时收敛入口,最后对已进索引的垃圾 URL 用 410 加移除工具请出去。整套动作的价值不在于多做几个页面,而在于把有限的抓取预算还给真正需要收录的正文页,这是内容站长期能被稳定收录的基础。