在外链域名查询里,如果两个 URL 返回的正文几乎一致,却带着不同的响应头,最直接的影响是:它们很可能不再被当作同一个可互换的抓取对象。此时保留、改写还是退出,取决于差异出现在哪一类响应头上,以及这些 URL 是否真的需要各自被访问。
响应头不是一个整体。对“内容相同”的两个地址,先看差异属于哪一层:
Cache-Control、ETag、Vary、Last-Modified。它们影响中间缓存和条件请求,通常不改变“这页是什么”的判断。Content-Type、Content-Language、Content-Encoding。它们决定解析方式、语言归属和是否需要解压,差异会直接影响抓取端如何解读同一段字节。Location、Set-Cookie、X-Robots-Tag。它们可能让一个地址根本不被当作内容页,或让抓取端在后续请求中改变行为。把差异归到哪一层,是后续取舍的前提。若只看“正文相同”就认定两页等价,容易在第二层和第三层上做出错误合并。
保留的前提是:两个地址各自承担了不同的访问角色,而且这个角色不能靠一个地址完成。
例如,假设 A 地址返回 Content-Language: en,B 地址返回 Content-Language: zh,正文主体相同但导航或少量文案不同。这时保留两个地址是合理的,因为语言表述本身就是页面的一部分,合并会丢失一种表述。再如,一个地址带 Vary: Accept-Encoding 而另一个不带,只要两者都能被正确解压和解析,通常不构成必须退出的理由。
反过来,如果差异只出现在 ETag 或 Last-Modified 上,而正文、语言、类型完全一致,保留两个地址的价值就很低。此时应优先考虑用一个地址承载,另一个做重定向或不再对外暴露。
实际动作:先对两个地址分别发一次不带条件的请求,记录状态码、Content-Type、Content-Language 和最终 URL。若最终 URL 相同而只有缓存头不同,说明它们很可能是同一资源的两种缓存表现,保留双地址的收益有限,下一步应转向确认哪个地址被外部链接引用得更多。
改写不是把两个响应头强行改成一样,而是先确认差异是否由可配置的中间层产生。常见来源包括反向代理、CDN 缓存规则、应用层根据 User-Agent 或 Accept-Language 分支输出。
如果差异来自缓存规则,改写 Cache-Control 或 Vary 可以让同一资源在不同请求下表现一致,这时改写是低风险的。但如果差异来自 Content-Language 或 Content-Type,改写等于抹掉一种真实表述,可能让某一类访问者拿到不匹配的内容。此时更稳妥的动作是保留差异,而不是统一。
一个可操作的检查是:把两个地址的响应头逐项列出,标记哪些项会改变解析结果、哪些只影响缓存。只对后者考虑改写。改写后重新请求一次,确认正文没有因协商变化而被替换成另一份内容。若改写导致正文也变了,说明差异不在缓存层,应回退到保留方案。
退出通常适用于以下情况:两个地址正文相同,其中一个的响应头使其无法被正常解析或访问,且它没有被外部链接单独引用。
例如,假设 B 地址返回 Content-Type: text/plain,而正文实际是 HTML。抓取端可能按纯文本处理,导致结构信息丢失。若 B 没有独立外链,退出 B、让 A 承担访问是合理选择。但如果 B 有大量外部链接指向,直接退出会让这些链接落到一个不再返回内容的地址上,此时应改为在 B 上做重定向到 A,而不是简单移除。
需要区分的是:X-Robots-Tag 设为 noindex 只表达“不要索引”,不等于该地址会从抓取队列中消失,也不等于外部链接会自动转移到另一个地址。robots.txt 的抓取限制同样不等于可靠的索引移除。因此,退出决策不能只依赖一个响应头字段,还要看该地址是否被外部引用、是否承担跳转入口。
面对“内容相同、响应头不同”,可以按下面顺序做一次对照,避免在保留、改写、退出之间反复:
Content-Type、Content-Language、Vary、X-Robots-Tag。这套顺序的核心不是追求两个地址完全一致,而是先确认差异是否改变了“这个地址是什么”的判断。只有不改变这一判断时,合并或改写才是安全的;一旦改变,保留或重定向通常比强行统一更稳妥。