当两个地址返回的正文一模一样、只有响应头不同,外链收录工具通常会把它们当成两个独立对象分别记录。影响最大的判断有三类:是否算重复内容、是否值得继续投入外链、以及抓取预算该优先给谁。缺少日志或后台权限时,你仍能做的动作是用 curl -I 对比状态码和关键响应头,再决定下一步是合并、保留还是放弃其中一个版本。
响应头种类很多,但真正改变收录判断的只有几组。第一组是状态码:200 与 301、302、404、410 会让工具得出完全不同的结论,一个被记为有效页面,另一个被记为跳转或失效。第二组是 Content-Type 与字符集声明,声明不一致时,工具可能按不同编码解析同一段字节,抽出的正文出现差异。第三组是缓存与内容协商相关头,例如 Vary 指向 Accept-Encoding 还是 User-Agent,会决定工具是否把两个响应视为同一资源的不同表示。
如果差异只出现在 Date、Server、X-Request-Id 这类与内容无关的字段,通常不构成新的判断依据,可以忽略。判断顺序建议是先看状态码,再看内容类型与编码,最后才看缓存协商类字段。
这种情况下优先做的是按响应头字段分组,而不是按 URL 分组。把同一正文对应的所有地址列出,逐一标注状态码、Content-Type、Vary 和返回字节数,然后看抓取工具实际访问了哪些、访问频率如何。如果发现抓取集中在其中一个版本,而另一个版本长期只有零星请求,说明工具已经通过响应头做了隐式选择,此时继续给冷门版本做外链,投入很可能被浪费。
可执行动作:对确认是同一内容的多版本,选一个作为主版本,其余用 301 指向它,然后观察下一次抓取时状态码是否按预期变化。这一步的结果直接决定后续外链该指向哪个地址——如果 301 生效且被抓取,外链应指向主版本;如果 301 长期未被抓取,说明主版本本身还没被充分发现,先解决发现问题再谈外链。
没有日志和后台时,你能看到的只是工具侧记录的“已发现”“已抓取”“已收录”等状态。此时不要试图从收录数量反推响应头的影响,因为工具的状态更新有延迟,且不同工具对同一响应头的处理并不一致。可行做法是固定一组地址,手动请求并保存响应头,隔一段时间重复一次,比较状态是否稳定。
可执行动作:用 curl -sI 分别请求两个地址,把输出保存下来对比。如果发现其中一个返回 301 而另一个返回 200,且正文相同,那么可以判断工具大概率会把 301 版本视为非终点,收录状态会向 200 版本收敛。反之,如果两者都是 200 但 Vary 不同,工具可能把它们当作可切换的表示,收录结果会出现摇摆,这时不适合把外链集中投向任一版本。
响应头不同,不能直接推出“重复内容已被惩罚”或“外链一定无效”。工具记录的状态只反映它自己观察到的抓取与索引行为,不等于搜索引擎的最终排序处理。以下推论都缺少充分依据:
robots.txt 屏蔽其中一个版本,就认为完成了去重——抓取限制不等于可靠的索引移除,被屏蔽的地址仍可能因外链被索引。这些现象都有多种合理解释,响应头只是其中一个变量。把单一观察当作因果,容易导致误操作,例如过早删除一个仍有外链价值的版本。
假设 /a 与 /b 返回完全相同的正文,/a 返回 200,/b 返回 301 指向 /a。外链收录工具显示 /a 已被抓取,/b 只有发现记录。此时合理动作是把外链统一指向 /a,并停止给 /b 新增外链。结果观察点:下一次抓取时 /b 是否仍被访问。如果仍被访问,说明外部还有指向 /b 的链接在起作用,需要继续处理这些来源;如果不再被访问,说明收敛完成,可以把精力转向 /a 的内容质量。
反过来,如果两个地址都返回 200,只有 Vary 不同,那么更稳妥的选择是保留一个主版本、把另一个改为 301,而不是同时给两者做外链。因为工具对内容协商的处理存在差异,同时投入会让判断依据变得混乱。
curl -sI 请求每个候选地址,记录状态码、Content-Type、Vary。这套动作不需要日志权限,但只能回答“响应头是否一致”“状态是否稳定”这两个问题,不能回答“哪个版本会被优先收录”。后者需要抓取数据或工具侧的长期观察才能判断。适用条件也应明确:如果正文本身会随用户或设备变化,那么响应头差异可能只是表象,真正需要处理的是内容协商逻辑,而不是收录工具的选择。