当两个 URL 返回的 HTML 主体几乎一致、只有响应头有别时,不能仅凭“内容相同”就判断二者等价。robots.txt 只约束抓取路径,不决定响应头含义;响应头里的状态码、Content-Type、X-Robots-Tag、Vary、Cache-Control 等字段,会分别影响抓取、渲染、索引与缓存判断。先确认差异字段,再决定是否把其中一个当作重复或规范版本。
小样本抽查时,两个 URL 的正文相同,肉眼看起来只是服务器配置略有不同。但规模化抓取后,部分样本出现收录状态不一致、缓存版本混乱或抓取频次变化。这并不证明响应头直接导致收录差异,只能说明响应头改变了后续处理链路中的某些条件。
常见差异集中在几类字段:Content-Type 是否声明为 text/html;X-Robots-Tag 是否携带 noindex 或 nofollow;Vary 是否按 User-Agent 或 Accept-Encoding 变化;Cache-Control 是否允许中间缓存复用;以及状态码是 200 还是 304、301。它们各自作用于不同环节,不能合并成一个“响应头不同”的笼统原因。
如果响应头包含 X-Robots-Tag: noindex,即使正文与另一 URL 相同,该响应也不适合作为索引候选。此时内容相同只是表面现象,真正影响判断的是索引指令。另一种情况是 Content-Type 缺失或写成非 HTML 类型,抓取器可能不按页面解析,后续的渲染与索引判断自然不同。
要区分这一解释,动作是:对同一组 URL 分别记录完整响应头,并检查是否存在 noindex、noarchive、nosnippet 等指令。若去掉该指令后,两个 URL 的索引候选状态趋于一致,说明差异主要来自指令而非正文。这个动作的结果会直接影响下一步——如果指令是有意设置的,就不应为了“内容相同”而强行合并;如果是误配,才进入修复流程。
当 Vary 或 Cache-Control 不同,中间缓存、CDN 或抓取器可能拿到不同版本。例如一个响应允许公共缓存,另一个要求每次回源;或者 Vary: User-Agent 使不同抓取器看到不同头部组合。此时“内容相同”可能只在某一次请求中成立,规模化后就会因为缓存命中不同而出现例外。
区分证据是:固定同一 User-Agent 与 Accept-Encoding,重复请求并记录响应头与正文哈希;再更换其中一个请求头,观察返回版本是否改变。如果正文哈希随请求头变化,说明差异来自内容协商或缓存策略。这个判断会改变处理顺序——先统一缓存与协商策略,再讨论重复内容,而不是直接改 robots.txt。
需要强调:抓取量或某项统计归零,不能单独证明响应头处理正确。它还可能来自抓取预算调整、站点整体改版、robots.txt 变更或服务器临时故障。必须结合上述证据交叉判断。
假设同一产品的两个 URL:A 返回 200、Content-Type: text/html、无 X-Robots-Tag;B 返回 200、正文相同,但带 X-Robots-Tag: noindex 且 Cache-Control: no-store。此时不能因为正文相同就把 B 当作 A 的重复版本。正确动作是先确认 B 的 noindex 是否为有意设置:若是,B 不应进入索引候选,讨论合并没有意义;若否,先移除该指令并统一缓存策略,再观察两个 URL 的抓取与索引状态是否趋同。这个动作的结果决定下一步是修指令、修缓存,还是处理重复内容。
单个样本中“内容相同、响应头不同”可能只是配置偶然一致,规模化后未必复现。robots.txt 的抓取限制不等于可靠的索引移除;站点地图不保证收录;HTTPS 不保证安全无漏洞或排名。不同搜索引擎对响应头指令的支持范围须分别核查,不能假设一套规则通用。只有在确认差异字段、固定请求条件并区分抓取与索引状态后,才能把样本结论用于批量决策。