做站一段时间后,site: 查询里除了主域名,常常还会冒出 test.example.com、staging.example.com,甚至 203.0.113.10/xxx 这样的裸 IP 地址。点进去内容与正式站一模一样。这不是抓取出了故障,而是访问入口没有收口:同一套页面被多个域名或地址指向,搜索引擎自然会当成多个站点处理。
为什么会出现多个入口
- 服务器默认虚拟主机没有限制,任何域名解析到这台机器都能返回同一份内容。
- 泛解析(*.example.com)开启后,任意子域名都能打开站点。
- 直接用 IP 访问时没有做 Host 校验,照样返回 200。
- CDN 回源配置了多个源站地址,预览域名、测试环境公网可访问。
- 开发阶段用 hosts 指过域名,上线后忘了清理解析记录。
这些入口对浏览器和爬虫是同等的。只要返回 200,爬虫就可能顺着外链、日志或历史记录找到它们,并逐条抓取。
先确认范围,再动手
- 用带 Host 头的请求检查状态码,例如 curl -I -H "Host: test.example.com" http://主IP/,看返回的是 200、301 还是 403。这一步能判断问题是“能访问”还是“只是解析存在”。
- 对该子域名和裸 IP 分别做 site: 查询,记录被收录的 URL 形态、路径规律和大致数量,判断是整站规模还是零星几条。
- 抽查这些页面的 canonical 标签。如果写的是相对路径,或由程序自动拼接当前域名,那么每个入口都会指向自己,等于主动告诉搜索引擎“我不是重复的”。
- 检查站点地图、内链、页脚、分享按钮、二维码和邮件模板里是否混入了测试域名。
处理方式:让入口收口到唯一地址
- 首选把测试域名与裸 IP 整站 301 到主域对应路径,并保留路径映射关系,不要一律跳到首页,否则原本有排名的页面会失去对应目标。
- 如果测试环境本来就不该对外服务,直接限制访问(IP 白名单、基础认证),返回 403 比返回 200 更清楚。
- 关闭泛解析,或在默认虚拟主机里配置一个明确的拒绝响应,避免任意子域名都能打开首页。
- canonical 一律使用绝对地址,主域固定为唯一版本(带 www 或不带 www,二选一,长期不变)。
- robots.txt 不适合用来区分主域与测试域名,因为爬虫取到的是同一份文件,很容易误伤主站目录。
处理入口收敛时,先让旧地址返回明确的跳转或拒绝状态,再谈索引更新。索引移除和替换需要时间,不要期待立刻消失。
容易忽略的几个细节
- 带 www 与不带 www 若都返回 200,本质上是同一类问题。
- HTTP 与 HTTPS 同时可访问,也会形成两套入口。
- 短链服务、二维码、历史邮件中写死了测试域名,外部引用不会自动失效。
- CDN 缓存里可能仍保留着旧入口的响应,收敛后需要确认缓存策略。
收敛之后怎么验证
重新用带 Host 头的请求抽查各入口状态,确认都指向主域或明确拒绝;对比处理前后的日志,观察测试域名下的抓取是否减少;在索引报告里持续观察主域页面数是否稳定,而不是忽高忽低。内链和站点地图全部改用主域绝对地址,是让收敛长期有效的关键一步。
把入口收口当成常规维护动作,比等到重复收录已经形成规模再补救要省事得多。每次上线新环境、新增解析记录时顺手检查一遍访问状态,就能避免同类问题反复出现。