内容相同、响应头不同,最容易被误判的是“哪个 URL 才是规范版本”。如果两个地址返回完全一样的正文,但一个带 200、一个带 301 或 302,抓取和索引系统会优先相信响应头传达的地址关系,而不是肉眼看到的文字。因此,遇到这类情况时,先不要因为正文一样就认定两者等价;应把响应头当作独立证据,判断是保留现状、改写重定向,还是让其中一个地址退出索引。
正文相同只说明用户看到的页面相似,不说明两个 URL 在抓取层面是同一个资源。响应头里的状态码、Location、Content-Type、Vary、缓存指令,都会影响后续判断。尤其当同一套内容同时通过 200 和 3xx 返回时,系统可能把 3xx 视为地址迁移信号,把 200 视为可直接抓取并参与索引的页面。
更稳妥的做法是先固定一个可验证的假设:如果两个地址内容一致,但一个明确跳向另一个,那么跳转目标更可能被当作规范候选。 但这不是绝对结论,因为跳转类型、跳转链长度、目标页是否可抓取、是否有其他信号指向原地址,都会改变结果。
这里的“保留”指继续让两个地址都返回内容;“改写”指调整重定向方向或状态码;“退出”指让其中一个地址不再作为可索引页面出现。三者不是按偏好选择,而是按证据选择。
Vary 区分缓存版本。此时内容相同不代表应合并,强行重定向反而可能破坏原有分发逻辑。robots.txt 的抓取限制不等于可靠的索引移除;它可能阻止抓取,却不能让已收录地址自动消失。如果拿不准,先做一个小范围验证:只改一个非核心地址的响应头,观察抓取日志、跳转链和规范信号是否朝预期方向变化。这个动作的结果会决定下一步是扩大范围,还是回退到保留状态。
第一,干扰规范地址判断。正文相同但一个 200、一个 301,容易让人误以为“两个都能作为规范页”。实际上,301 通常表达永久迁移,目标页更可能成为规范候选;若目标页又返回 200 且可抓取,这种关系更明确。若目标页返回 404 或 5xx,跳转关系就失去可靠落点。
第二,干扰索引状态判断。一个地址返回 200,另一个返回 302,不能简单认为 302 地址“已经不存在”。302 是临时跳转,原地址仍可能被访问和评估。若长期使用 302 代替 301,系统可能继续保留原地址的索引状态,而不是立即完成替换。
第三,干扰内容类型判断。相同正文若一个返回 text/html,另一个返回其他类型,抓取系统可能不会按普通 HTML 页面处理。此时“内容一样”没有意义,因为解析入口已经不同。
第四,干扰缓存与变体判断。带 Vary 的响应可能让同一 URL 因请求头不同而返回不同版本。若只看正文相同,就忽略变体关系,可能把正常的多版本响应误判为重复页面。
假设某站有 /a 和 /b 两个地址,正文完全一致。/a 返回 200,/b 返回 301 并指向 /a。外部入口大多指向 /b,但 /a 也有少量入口。
此时可先判断:如果 /b 的 301 稳定、/a 可正常抓取,且没有地区或设备分流需求,那么保留 /b 作为跳转入口、让 /a 承担规范页面,通常是可解释的取舍。下一步应检查 /a 是否还有跳转链、是否被其他地址重复指向,以及 /b 的跳转是否被错误地写成 302。若发现 /b 是 302,先改写为 301 再观察,而不是直接删除 /b。
反过来,如果 /a 和 /b 分别服务不同语言,且响应头差异来自 Vary 或内容协商,那么改写重定向可能破坏原有分发。此时更合理的动作是保留两个地址,分别核查它们的抓取和索引表现,而不是强行合并。
Location、Content-Type、Vary 和缓存相关响应头。完成这些核查后,保留、改写或退出的选择才有依据。内容相同只是起点,响应头不同才是决定下一步动作的关键证据。