很多站点在浏览器里看起来只有一个地址,但从抓取工具的角度看,同一份内容可能对应着好几套 URL:带 www 与不带 www 各一套,http 与 https 各一套,有的还带默认端口或测试子域。蜘蛛把每一套都当作独立 URL 去发现和排队,抓取额度被摊薄,重复内容也更容易出现。这类问题不难查,但需要按顺序排查一遍。
常见的几种主机名变体
- 协议变体:http://example.com 与 https://example.com 都能打开,且都返回 200。
- 子域变体:www 与非 www 同时可访问,页面内容完全一致。
- 端口与调试域名:example.com:8080、test.example.com、staging 环境对外可访问。
- 大小写与尾随点:Example.com、example.com. 在某些服务器配置下也能返回 200。
- CDN 与源站域名:回源域名被搜索引擎发现并抓取。
先确认到底有几个版本能返回 200
用几条命令就能看清楚。把下面几个地址依次请求一遍,重点看状态码和最终跳转到的 URL:
- curl -I http://example.com
- curl -I https://example.com
- curl -I http://www.example.com
- curl -I https://www.example.com
如果四个都返回 200,说明存在四个可抓取的副本;如果返回 301 并指向同一个规范地址,那基本没问题。另外可以在服务器日志里按 Host 字段统计,看看到底有多少个主机名在被真实抓取。
统一策略:只保留一个规范主机名
确定一个规范形式(例如 https://www.example.com),其余全部 301 过去。做法上注意几点:
- 用 301,不用 302 或 JS 跳转。前端脚本跳转和 meta refresh 对抓取工具来说往往只是页面内容,主机名统一得不够明确。
- 跳转要一步到位。http 跳到 https 再跳到 www 的两跳链路,尽量合并成一跳。
- 证书要覆盖全部变体。否则 http 版本能跳,https 的另一个变体却直接报错,抓取记录里就会出现失败项。
- 内链、站点地图、canonical 全部写同一个主机名。这三处写错,等于自己把蜘蛛引到非规范版本上。
容易被忽略的几个点
站点地图与 canonical 的一致性
站点地图里如果混着两种主机名,等于主动提交重复 URL。canonical 也建议自引用到规范主机名,别指向另一个版本。
测试环境不要暴露在公网
staging、dev、uat 这类子域如果没做访问控制,被抓到之后可能长期留在索引里,清理起来比预防麻烦得多。
CDN 回源域名的处理
部分 CDN 会提供默认回源域名,如果它可以直接访问且返回 200,最好在源站或 CDN 侧限制,只允许特定 Host 的请求。
主机名统一不是一次性工作。换证书、换 CDN、加子域的时候,都值得再跑一遍上面那四条 curl。
把这件事做干净,收益不是立刻多收录多少页,而是让抓取额度集中在一个规范地址上,服务器日志里的抓取记录也更容易看懂。