先给出结论:如果两个地址返回的可见正文几乎一致,但响应头不同,收录判断不能只看“内容像不像”,而要分别看抓取是否成功、规范地址指向谁、缓存与内容协商是否稳定。最容易出错的场景是同一份内容既走 200 又走 304,或一边带 Content-Language、一边不带,导致你误以为其中一版已被放弃收录。
不要拿整站对比。选一个具体页面,例如 /guide/a,再找出与它正文相同的另一个地址,例如带参数的 /guide/a?from=nav。把两个地址的响应头分别抓下来,至少记录状态码、Content-Type、Content-Language、Cache-Control、Vary、Last-Modified、ETag 和 Link。如果站点有 CDN,还要注明命中的是缓存节点还是源站。
这个动作的结果会直接决定下一步:如果两个地址只有 Cache-Control 不同,问题通常停留在缓存层;如果状态码或 Vary 不同,才需要继续查规范与索引。
页面正文相同,不代表搜索引擎会把它们当成同一页。若一个地址返回 Link: <https://example.com/guide/a>; rel="canonical",另一个没有,那么“哪一版该被收录”就有了明确偏向。反过来,如果两版都声明自己为规范地址,就形成了互相竞争,抓取记录里可能分别留下痕迹。
这里要区分两种情况:
200,但只有一版带规范头:优先按带规范头的那版观察,另一版应检查是否被当作重复内容。200,另一版返回 304:304 只是告诉抓取工具“本地缓存仍可用”,不等于页面被删除,也不等于收录被取消。如果响应头里出现 Vary: Accept-Language 或 Vary: User-Agent,同一个地址可能因请求头不同而返回不同正文或不同语言版本。此时“页面内容相同”这个前提可能只在某一次抓取中成立。继续比较时,应固定请求头再抓一次,而不是拿两次不同条件的响应下结论。
一个假设例子:/guide/a 在带 Accept-Language: zh-CN 时返回中文正文,在不带该头时返回英文正文,两版正文长度接近但语言不同。若只看到“内容相同”就合并处理,可能把本来分开的语言版本误判为重复页面。更稳妥的动作是分别记录两组响应头,再决定是否保留语言区分。
响应头之外,还要看 robots.txt 和页面级限制。robots.txt 的抓取限制不等于可靠的索引移除:它可能阻止抓取,却不能保证已收录地址立刻消失。若一个地址返回 200 但被 robots.txt 挡住,另一个地址可抓取且正文相同,你看到的“只有一版被处理”未必是内容判断的结果,可能只是抓取路径不同。站点地图也不保证收录,它只提供发现线索。
面对“保留两个地址”和“合并到一个地址”,选择条件不是看哪个响应头更漂亮,而是看业务是否需要两个地址各自承担入口。若两个地址面向同一批用户、同一语言、同一功能,合并更合理;若其中一个地址承担参数追踪、语言切换或登录态差异,就不能简单合并。
Vary,确定保留哪一版作为规范地址,并让另一版明确指向它。执行后的结果会影响下一步:如果修正规范头后,抓取记录仍分别出现两个地址,说明还有其他入口或内链在指向非规范版,需要继续查链接来源;如果抓取记录只剩规范版,才适合进入索引状态观察。不要因为某次抓取量或请求量归零就断定处理正确,缓存、抓取频率调整和临时错误都可能造成类似现象。
如果两版响应头不同,但其中一版从未被内链、站点地图或外部链接指向,且规范头已明确指向主版本,那么优先观察主版本的抓取与索引状态即可。此时强行修改所有响应头,可能引入新的缓存或语言判断问题。相反,如果两版都有独立入口,且响应头分别声明自己为规范地址,就应尽快统一,否则后续判断会一直互相干扰。
把页面对象、响应头差异和入口来源放在同一张记录里,再决定是修缓存、修规范还是修抓取限制,这样得到的结论才不会被“内容相同”这个表面现象带偏。