做站点运营的人偶尔会遇到这种场面:查一下自己的品牌词,结果冒出来一个 staging.example.com,或者部署平台自动生成的预览地址,内容跟正式站几乎一样。测试环境本来只是给自己看的,一旦被索引,就成了跟正式站抢同一批页面的副本。
先分清是哪一种测试地址
- 临时预览域名:每次构建都换一个随机地址,用完即弃。
- 固定测试域名:staging、test、dev、beta 这类,长期存在。
- 旧域名或旧 CDN 地址:站点迁移后没有下线的老入口。
- 带端口或直接 IP 的访问地址:能对外打开,但没有任何访问控制。
类型不同,处理方式也不同。临时预览域名基本可以删掉;固定测试域名往往要长期保留给内部或客户使用,那就只能靠访问控制,而不是指望它消失。
它们通常是怎么被发现的
- 测试地址被分享出去,聊天记录、邮件、外部文档里留下了可点击链接。
- 同一套模板部署到多个域名,sitemap 里写的是相对路径,被一起提交。
- robots.txt 没有区分环境,测试域名沿用了正式站的规则。
- 模板里的 canonical 用了相对路径或动态域名,指向自己所在的测试域名。
- 站点的日志文件、接口返回、静态资源列表里带着测试域名的绝对地址。
这几点里,canonical 和 sitemap 是最容易被忽略的,因为它们藏在模板和配置里,部署时不会报错。
按优先级处理的顺序
- 先加访问控制。Basic Auth、IP 白名单或内网访问,是唯一能让爬虫根本进不来的手段,也是成本最低的一步。
- 必须对外开放的,用 noindex。给整站加 X-Robots-Tag: noindex 响应头,比在页面里塞 meta 标签更省事,也不依赖模板改动。
- 已经进索引的,走移除流程或 301。整站废弃的测试域名,把它 301 到正式站的对应页面,而不是首页;还要保留的,用站长平台的移除工具,但要清楚它是临时的。
- 核对 canonical 归属。正式站每个页面的 canonical 指向自己的正式地址,测试域名的模板不写死指向正式站,避免两边互相指认。
- 堵住泄露入口。清理外部文档里的链接、不再提交测试域名、检查 sitemap 是否只写正式域名。
常见的错误组合是:robots.txt 里 Disallow 了测试域名,同时又指望 noindex 生效。爬虫被挡在门外,读不到 noindex,页面就会一直留在索引里,只剩一个没有摘要的外链标题。
几个容易踩的坑
- 只加 robots.txt 屏蔽,以为等于删除,结果索引里长期挂着旧地址。
- CDN 或反向代理重写了响应头,把 noindex 覆盖掉了,实际下发的还是正式站的头。
- 测试域名统一 301 到首页,用户和爬虫都被送到不相关的地方,迁移信号反而更乱。
- 根因没解决,只依赖移除工具,下次部署换个域名又重来一遍。
处理完之后怎么核对
用站点查询看测试域名下的 URL 数量是否在减少,同时翻一下服务器日志,确认这些域名已经不再出现抓取记录。如果还持续有抓取,多半是访问控制没覆盖到某个子域,或者 CDN 上还留着旧的回源配置。核对的重点不是快,而是确认入口已经关掉。
更省事的做法是在部署模板里默认给非正式域名加 noindex 响应头,让测试环境从出生那天起就不具备被索引的条件,省掉事后的收拾成本。