在大多数情况下,两个 URL 返回的 HTML 正文完全一致、只有响应头不同,搜索引擎仍会把它们当作同一份内容处理,差异本身不足以改变收录结论。但有一个例外:当响应头中的状态码、Content-Type 或 X-Robots-Tag 表达了与正文相矛盾的信号时,抓取和索引阶段的判断会以响应头为准,此时“内容相同”就不再是决定因素。
正文相同不代表页面等价。抓取工具在解析 HTML 之前,先读的是响应头,它决定这个响应是否值得进入下一步。
200 与 301、404、410 的差别不是内容差别,而是“这个地址还算不算数”。如果旧地址返回 301 指向新地址,即使两边正文逐字相同,旧地址也会逐步退出索引。text/html 才会按网页解析。若声明成 application/octet-stream 或其他类型,正文再完整也可能不被当作页面处理。noindex 与写在 HTML 里的 meta robots 效果方向一致,但响应头对非 HTML 资源同样生效,且优先级更高,容易在只检查页面源码时被漏掉。换句话说,需要区分的是“内容信号”和“可索引性信号”。前者看正文,后者看响应头。两者冲突时,先解决冲突,再谈内容质量。
假设一个网店把旧活动页 A 的正文原样复制到新地址 B,A 返回 301 到 B,B 返回 200。这种情况下,A 的正文相同并不会让 A 继续留在索引里,因为 301 表达的是“这个地址已经不用了”。
反过来,如果 A 返回 200 且正文与 B 相同,但 A 的响应头带 X-Robots-Tag: noindex,那么抓取仍会发生,索引却会被拒绝。此时用“内容相同”去推断“两个页面都会被收录”就是错的。
这个反例说明:响应头不是正文的附属描述,而是独立的处理指令。只要指令与正文意图矛盾,指令优先。
在旧内容、旧系统或旧合作关系需要退出、但仍有价值的部分要保留时,先明确前提:你要保留的是这个地址,还是这份内容?
Content-Type 是否为 text/html,响应头中是否存在 noindex。三项都正常,正文相同就不构成问题。执行第 2 步后,下一步应观察旧地址的抓取请求是否逐步减少、目标地址是否开始承接原有信号。如果旧地址仍被频繁抓取,说明 301 尚未被充分处理,此时继续等待比反复修改正文更合理。
旧地址抓取请求下降,可能来自 301 生效,也可能来自 robots.txt 阻断、服务器临时故障或抓取配额调整。这几种原因的表现相似,但含义完全不同。仅凭抓取量归零就判断“退出成功”,容易掩盖真实问题。
同样,站点地图里保留旧地址、或把新地址加进站点地图,都不构成收录保证。站点地图只是发现线索,不是索引指令。
可以按这个顺序区分原因:先确认响应头是否稳定返回预期状态码,再检查 robots.txt 是否误伤了需要保留的地址,最后才看抓取日志的变化趋势。任何一步出现矛盾,都说明前面的结论需要重估。
对每个涉及退出的地址,记录四项:当前状态码、Content-Type、是否存在 X-Robots-Tag、正文是否与目标地址重复。四项中只要有一项与预期不符,就先修这一项,不要同时调整正文和响应头——否则无法判断是哪一项改变了结果。
当四项都符合预期后,再等一个完整的抓取周期,对比旧地址与新地址的抓取分布。若旧地址仍在被大量抓取,优先复查 301 的目标是否可达、是否形成了跳转链,而不是回头去改正文内容。把响应头当作独立变量处理,才能让“内容相同”这件事不再干扰对收录状态的判断。