做站点运营的人偶尔會遇到這種场面:查一下自己的品牌词,结果冒出来一個 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 响應头,让測試环境從出生那天起就不具备被索引的條件,省掉事後的收拾成本。