响应头不同而 HTML 正文相同,最先受影响的不是“页面能不能打开”,而是你对页面身份的判断:搜索引擎可能把它们当成同一页的不同变体,也可能当成两个独立资源。判断错方向,后续的 canonical、重定向、缓存清理都会做偏。
假设你有一个 vip域名下的页面 A 和页面 B,正文逐字相同,但响应头里 Content-Type、Cache-Control、Vary 或状态码不同。此时有两种解释。
这两种解释对应完全不同的动作。前者要收敛头部策略,后者要处理重复内容。先别急着改 canonical,先找证据区分。
最直接的一条:用同一请求头分别抓取两个地址,观察状态码和 Vary。如果两个地址在相同请求头下返回完全相同的响应头,差异只在更换 Accept-Language 或 User-Agent 后才出现,那更接近解释一。如果两个地址在相同请求头下依然稳定地返回不同头部,更接近解释二。
第二条证据是重定向链。用 curl -I 或浏览器开发者工具看完整跳转,如果其中一个地址最终 301 到另一个,正文相同只是跳转前的旧缓存,那么问题在缓存而非索引。如果两者都停在 200,没有跳转,重复内容的可能性上升。
第三条是抓取日志。如果两个地址都被频繁抓取、且抓取时间接近,说明搜索引擎把它们当作两个待处理资源;如果只有一个地址被抓取,另一个只出现在外链或站点地图中,差异可能来自发现路径而非头部本身。
假设 vip域名下 /page 返回 Cache-Control: max-age=3600,/page?v=1 返回 Cache-Control: no-store,正文相同。你怀疑是缓存导致两个版本被分别收录。
先做一步动作:在两个地址上分别请求并记录响应头与正文哈希。结果发现正文哈希一致,但 Vary 字段只有一个地址存在。这说明差异来自头部策略而非内容本身,下一步应统一 Vary 与缓存策略,而不是加 canonical。如果哈希不一致,说明正文其实不同,那问题就回到内容重复,处理顺序要反过来。
这个例子里的数字只用于说明比较方法,不代表任何真实站点的缓存时长或收录结果。
第一,canonical 的判断。页面正文相同,但一个返回 200 一个返回 304,你会误以为 304 的那个“没被收录”,实际上它只是缓存命中,不代表索引状态。
第二,重复内容的判断。两个地址正文相同、头部不同,如果其中一个带 X-Robots-Tag: noindex,另一个没有,那 noindex 只作用于前者,不能推断后者也会被移除。robots.txt 的抓取限制不等于可靠的索引移除,这条在这里同样成立。
第三,站点地图与收录关系。两个地址都写进站点地图,不保证都被收录;只写一个,也不保证另一个不会被发现。站点地图不是收录承诺。
第四,HTTPS 与安全判断。如果两个地址一个走 HTTPS 一个走 HTTP,正文相同,不要因为 HTTPS 就推断排名或安全一定更好。HTTPS 不保证安全无漏洞或排名,它只是传输层的一个条件。
如果常规做法都试过仍没解决,最可能遗漏的是“同一正文在不同请求头下返回不同响应头”这件事本身。动作顺序建议如下。
Content-Type、Vary、Cache-Control 和正文哈希。Accept-Language),重复抓取,看响应头是否随请求头变化。不同搜索引擎对 Vary、X-Robots-Tag 和协商内容的支持情况须分别核查,不要用一次抓取结果推断所有引擎的行为。做完这一步,你才能确定该改头部、改内容,还是改发现路径。