索引里的“自己人”往往不是正式页面
核对收录时,很多人先看正式域名的数量变化,却忽略了一件更常见的事:索引里混着测试域名、预览链接和 CDN 默认域名。这些 URL 通常和正式页面内容几乎一致,只是域名或路径不同,一旦被抓到,就会和正式页面争夺同一个位置。
它们出现的路径并不复杂:给同事分享一个预览地址、页面源码里写死了绝对地址、对象存储的默认域名没关、测试环境的 sitemap 没有加访问限制,甚至只是某个内部工具页面上挂了一条可点链接。对爬虫来说,这些都属于“可以被发现的 URL”。
常见的外露来源
- 预览域名、staging 子域、临时 IP 没有做访问限制,公网可直连。
- CDN、对象存储或托管平台的默认域名与正式域名指向同一份内容。
- 页面模板、站点地图、RSS 或邮件模板里写死了测试环境的绝对地址。
- 分享链接、内部工具、表单跳转中带着可被外部访问的临时地址。
- 测试环境自己生成了一份 sitemap.xml,并被扫描工具发现。
这些来源的共同点是:不需要被“提交”,只要能被链接到、被猜到,就可能在某次抓取中被带走。
核对顺序:先盘点,再动手
在决定用哪种手段之前,先把范围量清楚,否则容易一边清一边漏。
- 按 Host 分组看访问日志。把日志里的请求按域名归类,看有哪些域名在被持续抓取,重点看不该出现在公网的那几个。
- 抽查索引状态。用站内检索语法按域名抽查,确认这些域名下是否已有页面被索引,以及大致规模。
- 看返回状态与内容。确认这些地址返回的是 200 还是登录页、验证页;返回 200 且内容和正式页面近似的,优先处理。
- 与正式域名做内容比对。挑几条样本对比,判断是完整复制还是局部差异,这决定了后续是收敛还是直接阻断。
这四步做完,通常能看清一件事:问题出在“地址被公开”,还是出在“内容被同步发布”。两者的处理方式并不相同。
阻断手段的优先级
最稳的是让它根本访问不到
给测试环境加访问限制、改用内网地址、关闭默认域名、避免在公网模板里写死测试地址,这些做法不影响正式站点的抓取行为,也不用担心指令冲突。能这么做时,优先这么做。
其次是页面级指令,但别让指令互相打架
如果一时无法关闭访问,可以用页面级指令声明不要索引。要注意的是,如果同时在抓取层面做了全站禁止,页面上的指令往往读不到,两边配合不好会得到和预期相反的结果。打算清理已有索引时,通常需要先让页面可被抓取、再明确表达不入索引的意愿。
已有索引的部分,按页面逐个收敛
已经进入索引的 URL,需要按状态分别对待:能直接关掉的直接关掉,必须保留访问的改指令,确实是正式内容的再做规范化。数量大时不必追求一次清完,先处理被抓取频次高、和正式页面重合度高的那批。
避免下次再外露
- 预览与测试环境的默认状态是“不可公开访问”,而不是“记得加限制”。
- 模板、站点地图、RSS 里的域名统一走配置项,不要手写绝对地址。
- 上线前抽查一遍页面源码和分享链接,看是否带出了内部域名。
- 把域名清单纳入定期核对,每次看收录时顺手确认一遍 Host 分布。
收录本身是抓取与索引流程的结果,不是一个可以随手打开的开关。清理测试域名和预览链接的价值,在于让索引范围回到正式内容上,而不是把数量做大。
把这一步做成常规动作后,再去看正式页面的收录情况,判断会清晰很多:哪些是真正没被发现的内容,哪些只是被别的地址提前占位了。