结论先说:如果两个 URL 的可见正文完全一致,但响应头不同,搜索引擎通常会把它们当作两个独立响应分别处理,而不是自动合并成一份内容。影响最大的三类判断是:抓取与缓存是否复用、规范化目标偏向谁、以及旧 URL 能否作为“已退出”被清理。但这个结论有一个明确反例——当差异只出现在 Date、Server 这类与内容身份无关的头部时,它几乎不会改变上述判断。
判断影响之前,先给头部归类,否则容易把噪声当成信号。
Content-Type、Content-Encoding、Vary、Link(含 rel=canonical)、X-Robots-Tag、Location、Cache-Control 中的 noindex 类指令。这些会直接改变“这个 URL 是什么、能不能被索引”的判断。Date、Server、Connection、ETag 的生成规则、Age。它们影响缓存协商效率,通常不改变内容身份。一个实际动作:把两个 URL 的响应头各抓一份,逐行标注属于哪一类。结果会直接决定下一步——若差异集中在第一类,就必须按两个独立页面处理;若只在第二类,可以合并到同一次索引申请里观察,不必为头部差异单独建规则。
假设旧系统页面 A 与新页面 B 正文一致,但 A 的响应头里带 Link: </b>; rel="canonical",B 没有。此时搜索引擎收到的信息是:A 主动声明 B 是代表版本,而 B 没有反向声明。这会让规范化判断偏向 B,但不等于 A 会被自动移除。规范化是“选代表”,不是“删除重复项”。
反过来,如果 A 带 X-Robots-Tag: noindex,B 不带,那么即使正文一致,A 被当作不可索引对象处理,B 仍可被索引。这时对 A 再做索引申请,与头部指令是冲突的,通常不会按预期生效。适用条件是:你确实希望 A 退出、B 保留。如果 A 仍有独立流量价值,这个组合就不成立。
当两个 URL 正文相同但 ETag 或 Last-Modified 不一致时,抓取端无法用条件请求复用已缓存副本,只能重新取回完整响应。这不会改变内容判断,但会改变抓取预算的分配:同一份内容占用两次抓取机会。
一个注明假设的短例子:假设某站每天抓取配额有限,旧系统 500 个 URL 与新系统 500 个 URL 正文一一对应但 ETag 各自生成。若两者并存且都允许抓取,等于把一半配额花在重复内容上,新页面的发现速度会被拖慢。这里的数字只用于说明比较方法,不代表任何真实站点数据。
对应的动作是:确认旧系统是否能在响应头层面统一 ETag 生成规则,或直接对旧 URL 加 X-Robots-Tag: noindex 并保留可访问。做完后观察抓取分布是否向新 URL 集中,再决定是否需要进一步做 301。这一步的结果会决定后续是“继续靠头部指令共存”还是“必须做跳转收口”。
反例一:差异只在 Date、Server、Age 上。这些头部每次请求都可能变化,与内容身份无关,不会改变规范化、索引或缓存复用的判断。此时不必为它们设计任何处理规则。
反例二:两个 URL 实际返回的正文并不完全相同,只是肉眼看起来一样——比如分页、排序参数、登录态导致的细微差异。这种情况下响应头差异只是表象,真正要解决的是内容差异本身。
还要注意:robots.txt 的抓取限制不等于可靠的索引移除,被限制抓取的 URL 仍可能因外部链接出现在结果中;站点地图也不保证收录。响应头层面的 noindex 才是更直接的移除信号,但它需要页面可被抓取才能被读到,这两者存在取舍。
ETag 生成规则,或给旧 URL 加 noindex。如果第 3 步改动后抓取分布没有变化,先排查是否存在其他未统一的头部,而不是直接叠加更多指令。不同搜索引擎对 X-Robots-Tag、Link 头部的支持范围需要分别核查,不能假定行为一致。把变量控制住,索引申请的判断才有可复现的依据。