如果两个地址返回的正文几乎一样,只是响应头不同,最容易被误判的是“哪个地址才是规范版本、哪个地址值得被抓取和索引”。响应头本身通常不会直接决定收录,但它会影响抓取器对内容类型、缓存、跳转和规范信号的判断;当正文相同而头不同,这些判断可能分叉,导致你提交的地址与系统选中的地址不一致。
现象是:同一段正文出现在 A、B 两个地址上,A 是你希望被收录的版本,B 是参数页、旧路径或镜像路径。你提交了 A,但抓取和展示表现仍不稳定。常见有两种解释。
解释一:系统把它们当作重复内容,正在自行选主。 当正文高度相同,抓取器会综合链接、跳转、规范标签、站点结构和响应头来选一个代表地址。此时响应头不同,可能让两个地址在“是否可缓存、是否立即跳转、内容类型是否明确”上表现不同,从而影响它更倾向于保留哪一个。
解释二:其中一个地址的响应头给出了错误或矛盾的指令。 例如 A 返回 200 且正文正常,但带有与页面意图不一致的缓存或内容类型;B 返回 200 且正文相同,却带有指向 A 的规范信号。抓取器可能先按 B 的头部处理,再结合正文判断,结果与你提交的 A 不一致。
这两种解释的差别在于:前者是正常的重复内容选主过程,后者是头部配置引入了额外分叉。处理方式不同,不能只靠“再提交一次”解决。
不是所有头部差异都同等重要。可以按下面几类区分。
text/html,B 返回 application/octet-stream 或错误类型,抓取器可能不把 B 当普通网页处理,甚至不解析正文。此时正文相同也没用,B 的头部已经改变了“这是什么资源”的判断。noindex,即使正文正常、你提交了 A,抓取器也会按头部指令处理。若 B 没有该头,两个地址的索引资格就不同。换句话说,Content-Type、状态码、跳转和 X-Robots-Tag 会直接改变“这个地址能不能作为独立页面被处理”;缓存类头部更多影响抓取节奏和新鲜度,不直接等于收录开关。
要区分“重复内容选主”和“头部矛盾”,可以按下面顺序取证。假设你有一个 A 地址和一个 B 地址,正文相同,你希望 A 被收录。
这些证据可以给出一个明确分界:如果两个地址的头部都允许索引、都返回 200、Content-Type 都正确,只是缓存策略不同,那么问题更接近重复内容选主;如果其中一个地址带有 noindex、错误 Content-Type 或跳转,那么先修头部,再谈提交。
假设同一篇内容同时存在于 /article 和 /article?from=old。你提交了前者,但后者被频繁抓取。检查发现:前者返回 200、text/html、无 noindex;后者返回 200、text/html、无 noindex,但带有 Cache-Control: no-store,且页面内部 canonical 指向前者。此时两个地址的索引资格相同,头部差异主要在缓存,系统选主更可能受链接和 canonical 影响。
下一步动作应该是:把站内链接和站点地图统一指向 /article,并确认 /article?from=old 的 canonical 稳定指向前者。做完这一步后,再观察抓取器请求哪个地址更多。如果请求仍集中在后者,再检查后者是否被外部链接大量引用;如果请求转向前者,说明之前的分叉主要来自链接和规范信号,而不是缓存头本身。
如果检查发现 /article?from=old 带有 X-Robots-Tag: noindex,而 /article 没有,那么动作顺序要反过来:先确认你希望哪个地址被索引。若希望前者被索引,后者带 noindex 是合理的,但必须确保前者没有被其他头部或页面信号指向后者。若两者都不该被索引,则不要只依赖 robots.txt 限制抓取,因为 robots.txt 的抓取限制不等于可靠的索引移除。
要让“网站收录提交”这个动作有意义,先满足三个条件:目标地址返回 200 且 Content-Type 为 text/html;目标地址没有 noindex 类头部或页面指令;站点地图、内部链接和 canonical 指向同一地址。三者不一致时,提交只会把矛盾暴露得更明显,而不是解决它。
站点地图不保证收录,提交也不保证抓取器会按你的偏好选主。你能做的是减少信号冲突:让正文相同的两个地址在头部、状态码、规范标签和链接指向上尽量收敛。收敛之后,再根据抓取器实际请求的地址决定下一步是改链接、改头部,还是继续观察。