如果两个地址返回的正文完全一样,而响应头不同,百度索引层面最需要先判断的是:它们是否被当作同一份内容处理。响应头中的 Content-Type、Content-Language、Vary、X-Robots-Tag、Link 和缓存相关字段,会改变抓取器对编码、语言、变体、可索引性和规范关系的理解。正文相同并不等于处理结果相同,所以不能只凭肉眼看到的内容一致就下结论。
把手里两个地址的响应头逐项对照,先分成三类,后续动作完全不同。
Content-Type 的字符集不同,或 Content-Language 不同。这类差异会影响解码和语言归属,正文看起来一样,入库后的文本可能并不一样。Vary 指向的请求头不同,或缓存键不同。它说明同一地址可能因设备、语言、压缩方式返回不同版本,抓取器需要判断哪个版本代表该地址。X-Robots-Tag、Link 中的 canonical、以及重定向状态不同。这类差异直接改变“是否允许索引”和“哪个地址是规范”的判断。如果差异只落在第一类,优先检查解码后的正文是否真的逐字一致;如果落在第二类和第三类,优先检查抓取器实际拿到的是哪个版本。把这两步做完,才能决定是修响应头、改链接,还是保留现状。
不要用“两个页面看起来一样”作为唯一证据。可以按下面顺序收集可核对材料。
X-Robots-Tag 是否出现 noindex,以及 Link 里的 canonical 指向哪个地址。两者只要有一个不同,百度索引判断就可能分叉。这里有一个常见反常现象:正文完全相同,但其中一个地址长期不出现,另一个地址正常。此时不能直接归因于“内容重复”。同样合理的解释还包括:该地址被 X-Robots-Tag: noindex 阻止、canonical 指向了别处、响应头声明了不同语言导致归入不同语言索引、或缓存层返回了旧版本。请求量或抓取量归零只能说明抓取器近期没有访问,不能单独证明索引处理正确或错误。
假设同一篇文章可通过两个地址访问:A 返回 Content-Type: text/html; charset=utf-8,无 X-Robots-Tag,Link 中 canonical 指向 A;B 返回相同正文,但 Content-Type 声明 charset=gbk,且 canonical 指向 A。此时较合理的判断是:B 被当作 A 的重复或变体,而不是独立内容。下一步应统一字符集声明,确认 B 的字节编码与声明一致,并保留 canonical 指向 A。若 B 还需要被独立访问,则应给它独立正文或明确的规范关系,而不是只改响应头。
反过来,如果 A 和 B 正文相同,但 B 的 X-Robots-Tag 含 noindex,那么 B 是否出现与内容重复无关,先处理指令差异。robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,所以不能用提交站点地图来替代对响应头的修正。
处理方案取决于差异是否影响“同一内容”的判断。
Content-Language 是否与实际内容语言一致。若不一致,修正响应头;若一致,则接受它们属于不同语言变体,分别维护。noindex 或错误 canonical,再观察抓取和索引状态。不要同时改多个变量,否则无法判断哪一步起了作用。Vary 和缓存键是否让抓取器拿到非代表版本。修正后固定请求头复抓,确认返回版本稳定。每一步动作都要有对应的验证结果:改完响应头后,用相同请求头复抓,对比状态码、正文哈希和指令字段;如果结果仍不一致,再回到上一步检查请求头或缓存层,而不是继续叠加新改动。HTTPS 不保证安全无漏洞或排名,响应头修正也不承诺收录或排名,它只改变抓取器对页面的判断依据。
对已有经验的读者,更实用的做法是给站点定一条规则:凡正文相同的地址,响应头中的字符集、语言、canonical 和可索引指令必须一致;若确实需要不同版本,就明确标注变体关系并分别验证。规则落地后,每次出现“内容一样但结果不同”的情况,先按表示差异、变体差异、指令差异三类归因,再用固定请求头的复抓结果验证。这样既不会把编码问题误判为重复内容,也不会把指令差异误判为抓取异常。