相同 HTML 从两个主域名候选返回,但响应头不一致时,最容易被误判的是“内容重复”本身。真正需要先判断的是:差异是否让搜索引擎把两个地址当成同一实体的不同表述,还是当成两个各自独立的页面。前者影响规范化与合并信号,后者影响抓取预算、索引选择和后续监测口径。响应头不是装饰,它决定了后续动作是合并、保留还是回退。
假设同一套页面同时挂在 example.com 和 www.example.com,HTML 完全一致,只有响应头不同。直觉上会认为“内容相同,选哪个主域名都一样”。但实际观察中,常见两种相反结果:一种是被当成重复版本,只保留一个;另一种是两个地址各自被独立抓取,甚至各自出现在不同查询里。
这种分叉不能只用“内容相同”解释。响应头里的 Content-Type、字符集声明、Vary、Link、Location、缓存相关字段,以及是否返回 200 还是 301,都会改变抓取器对“这个地址是什么”的判断。内容一样,不等于地址语义一样。
如果 A 域名返回 200,B 域名返回 301 指向 A,那么 B 的响应头本身就在说“我不是最终地址”。这时即使 B 的 HTML 与 A 相同,搜索引擎也更可能把信号归到 A。反过来,如果两个域名都返回 200,且都没有 Link rel="canonical" 或等价声明,抓取器没有理由自动把两者合并,只能分别处理。
这里的关键证据是状态码和 Location,而不是正文相似度。动作上,先抓取两个域名的响应头,记录状态码、Location、Content-Type 和 Vary。如果发现一个 301、一个 200,下一步应优先确认 301 是否稳定、是否指向最终主域名,而不是继续比对正文。
另一种解释是:两个地址都被当成独立可索引页面,响应头差异只影响中间缓存、字符集解析或内容协商,不直接决定哪个被收录。例如 Vary: User-Agent 或 Vary: Accept-Language 会让同一 URL 对不同请求返回不同版本,抓取器可能看到与用户不同的响应头,但这并不自动等于“重复内容合并”。
能区分这两种解释的证据是:对同一 URL 用不同请求头重复抓取,观察响应头是否变化、正文是否变化,以及变化是否稳定。如果只有缓存字段变化、正文和状态码不变,那么索引选择更可能由 canonical、内链和站点结构决定,而不是由缓存头决定。
不要只看“收录量”或“排名波动”来下结论。下面这组检查能帮助区分:
Location、Content-Type、Vary、Link。User-Agent 和 Accept-Language 再请求,比较响应头和正文是否一致。如果状态码和 canonical 都指向同一域名,响应头差异多半只影响缓存和呈现;如果两个域名都返回 200 且 canonical 各自指向自己,那么响应头差异更可能伴随独立的索引选择。此时下一步应统一 canonical 和内链,而不是先改缓存头。
假设主域名候选为 a.example 和 b.example,两者 HTML 相同。抓取结果显示:a.example 返回 200,b.example 返回 200,且 b.example 的 Content-Type 缺少字符集声明,Vary 为 Accept-Encoding。仅凭这组响应头,不能断定 b.example 不会被索引,也不能断定它一定会被合并。能说明问题的是 canonical 和内链:如果两者 canonical 都指向 a.example,则 b.example 更可能被当作重复版本;如果 canonical 各自指向自己,则需要先统一声明,再观察抓取和索引变化。
这个例子的数字只用于说明比较方法,不代表任何真实站点结果。动作上,先补齐 b.example 的字符集声明并统一 canonical,再重新抓取对比响应头。结果如果显示 b.example 的 canonical 被识别为 a.example,下一步才考虑是否保留 b.example 的 200 状态或改为 301。
请求量下降、抓取量归零或某个查询消失,都不能单独证明响应头处理正确。它们还可能由抓取预算调整、站点结构变化、内容更新或外部链接变化引起。更稳妥的做法是同时记录状态码、canonical、内链指向和站点地图中的地址,并在一段时间内比较这些字段是否趋于一致。只有当多个可核对信号都指向同一主域名时,才能判断规范化生效;否则应继续区分是响应头问题,还是索引选择问题。