页面正文完全一致时,响应头仍然会改变抓取、缓存、内容类型和规范化相关的判断。最容易被误判的是:把 X-Robots-Tag、Content-Type、Location 或缓存指令的差异,当成页面内容差异来处理。实际决策取决于两个条件:差异头字段是否影响抓取与索引,以及旧系统能否在不改变正文的前提下调整响应头。
响应头很多,但真正会改变判断的通常集中在几类。可以按下面的顺序排查:
noindex、nofollow 等指令。如果同一正文的两个 URL 只有一个带 noindex,那么即使页面文字相同,索引判断也可能完全不同。text/html 与 application/octet-stream 会导致抓取器对同一段字节做不同处理。前者按 HTML 解析,后者可能被当作下载文件。Vary 指定了 User-Agent 或 Accept-Encoding 时,同一 URL 可能按请求头返回不同响应。正文相同但 Vary 不同,会让缓存和抓取判断出现分叉。这里有一个常见误判:看到正文一致,就认为两个地址应当合并处理。但 X-Robots-Tag: noindex 或 Content-Type 错误,足以让其中一个地址无法按预期进入索引。此时要修的是响应头,而不是正文。
如果排查后确认差异仅在 Cache-Control、Expires 或 ETag,且两个地址都返回 200、Content-Type: text/html,也没有 X-Robots-Tag 的限制,那么可以优先保留旧系统,只统一缓存策略。动作是:在网关或反向代理层给两个地址写入一致的缓存头,然后观察抓取端是否仍频繁回源。
这个动作的结果会影响下一步:如果回源频率下降且正文未变,说明差异属于缓存层,不必迁移旧系统;如果回源依旧频繁,或者抓取端开始报告内容不一致,就需要继续检查 Vary 和 ETag 是否按不同规则生成。
如果差异包含 X-Robots-Tag: noindex、错误的 Content-Type,或一个地址返回 301 而另一个返回 200,那么不能只靠统一缓存解决。此时有两个成立的选择:
X-Robots-Tag 移除或改为允许索引,把 Content-Type 修正为 text/html; charset=utf-8,并确认最终 URL 一致。结果是抓取端会按同一套规则处理两个地址,后续只需观察哪个地址被选为规范版本。Content-Type 和缓存头。结果是旧地址的响应头差异不再参与判断,但需要确认 301 链没有指向另一个带限制头的地址。选择依据不是正文是否相同,而是差异头是否改变了抓取器对同一段内容的处理方式。如果会改变,就属于索引层问题;如果不会改变,就属于缓存层问题。
假设两个地址 A 和 B 返回完全相同的 HTML,但 A 的响应头包含 X-Robots-Tag: noindex,B 没有;A 返回 200,B 也返回 200;A 的 Content-Type 是 text/html,B 是 text/html。此时不能因为正文相同就认为 A 和 B 等价。A 可能长期不被索引,B 可能被索引,最终规范版本可能落在 B。下一步动作是移除 A 的 noindex,再观察 A 是否重新进入抓取与索引判断。
这个例子是假设,用来展示比较方法:先固定正文变量,再逐项替换响应头,看哪一项会改变抓取或索引结果。不要用“请求量归零”或“抓取量下降”单独证明某个头字段是原因,因为缓存过期、抓取配额变化、外部链接变动都可能产生同样现象。
第一,robots.txt 的抓取限制不等于可靠的索引移除。即使 robots.txt 禁止抓取,已经建立的索引记录仍可能保留一段时间,不能把它当作删除索引的手段。第二,站点地图不保证收录,响应头正确也不等于一定进入索引。第三,HTTPS 不保证安全无漏洞或排名提升,它只解决传输层的一部分问题。第四,不同搜索引擎对 X-Robots-Tag 和缓存指令的支持情况须分别核查,不能用一个引擎的表现推断另一个。
如果旧内容、旧系统或旧合作关系需要退出,先保留仍然有价值的正文,再决定响应头是修正还是随旧地址一起退出。动作完成后,下一步应核对最终 URL、Content-Type、X-Robots-Tag 和缓存头是否一致,而不是只确认页面文字相同。