先看现象。sitemap 由脚本按数据库里的全部文章生成,某次在测试库上跑了一遍,把 staging.example.com 的八百条地址也写进了线上 sitemap。两周后这批地址被收录,搜索结果里点进去是未完成的页面。

真正麻烦的地方在于,几个原因的现象几乎一样。生成脚本读的是数据库里的站点地址配置,测试库那份没改,混进了线上任务。也可能是脚本没有按环境过滤 host,任何环境跑都输出同一份。

少数情况下是staging 子域没有设置访问限制,蜘蛛能正常抓到。

不容易想到的是,sitemap 提交前没有人对比地址里的域名是否统一。

先统计 sitemap 里出现的所有域名

curl -s https://www.example.com/sitemap.xml | grep -o 'https://[^/]*' | sort | uniq -c

再往下在生成脚本里加一道 host 白名单,只输出当前环境域名

grep -rn 'site_url\|home_url' tools/gen_sitemap.php

给 staging 加 Basic 认证或 robots 全站屏蔽

auth_basic "staging"; auth_basic_user_file /etc/nginx/.htpasswd;

等前面都确认过,再对已收录的测试地址批量申请移除

恢复的判定其实很直接。sitemap 里只剩线上的一个域名,测试子域返回 401,收录里的那批地址两周内陆续消失。

测试库和线上库共用一份 sitemap 生成脚本,是这类事故最常见的来源,环境判断要写在最外层。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189