先给结论:当两个地址返回的正文几乎一样、只有响应头不同,百度不收录时最该查的不是“内容够不够”,而是哪个地址才是你希望被处理的那一个。响应头决定了抓取端看到的状态码、内容类型、缓存策略和规范化信号,这些都会改变后续判断。如果忽略它,你可能会把“重复地址之间的取舍问题”误当成“正文质量不足”,然后做一堆无效修改。
把你要处理的页面拿出来,分别记录它的完整响应头,至少包含状态码、Content-Type、Content-Length、Cache-Control、Last-Modified、ETag、Vary 和 Set-Cookie。不要只看浏览器地址栏,也不要用只显示正文的查看方式。若两个地址正文一致,但一个返回 200 且 Content-Type 为 text/html,另一个返回 200 却带 text/plain,抓取端对“这是不是一个可索引的 HTML 页面”的判断就会不同。此时先确认状态码和类型,再谈内容。
如果其中一个地址返回 301 或 302,另一个返回 200,那么问题通常不是“百度不收录这个正文”,而是“百度把哪个地址当作目标”。301 表示长期转移,302 表示临时转移;两者对后续合并信号的强度不同。动作上,先确定规范地址,再用服务器配置让其他等价地址稳定指向它。结果会直接影响你下一步是继续等,还是去查站内链接和站点地图是否仍指向旧地址。
假设你改了页面,复查时仍看到旧内容,先看 Cache-Control、ETag 和 Last-Modified。若 Cache-Control 设了很长的 max-age,抓取端或中间缓存可能继续返回旧版本;若 ETag 每次请求都变,抓取端可能认为资源频繁变化,但未必因此提高处理频率。这里的合理动作是:对同一地址连续请求两次,记录响应头差异和正文差异。若正文没变而 ETag 每次都不同,先把 ETag 改成基于内容或稳定版本生成,再观察后续请求是否还出现同样波动。
需要提醒的是,抓取量下降或某次请求返回 304 不能单独证明处理正确。304 只说明协商缓存命中,不说明页面已被收录;请求归零也可能来自抓取预算调整、robots 限制、服务器屏蔽或链接减少。判断时要结合服务器日志里的状态码分布,而不是只看一个指标。
如果响应头里出现 Vary: User-Agent 或 Vary: Cookie,而你没有为百度抓取端准备稳定版本,抓取端拿到的可能是简化页、登录提示或空壳。Set-Cookie 在抓取请求中反复下发,也可能让不同请求落到不同分支。动作上,用不带 Cookie、带常见抓取 UA 的请求各取一次,比较正文与响应头。若发现抓取端拿到的是与用户端不同的正文,先修正服务端分支逻辑,再谈收录。这个动作的结果会决定你下一步是改模板,还是改缓存和会话策略。
Content-Type 若写成 text/plain、application/octet-stream 或带错误 charset,抓取端可能不按 HTML 解析,正文再一样也无法形成正常页面判断。把类型修正为 text/html 并声明正确字符集后,再复查响应头是否稳定。若仍不稳定,继续查反向代理和 CDN 是否覆盖了源站头。
下面是一个假设例子,用于说明比较方法,不是真实项目结果。假设你有 /a 和 /b 两个地址,正文相同:/a 返回 200、text/html、无 Set-Cookie;/b 返回 200、text/html、带 Set-Cookie 且 Vary: Cookie。站内链接和站点地图都指向 /b。此时先不要改正文,而是把内链和站点地图改为指向 /a,并让 /b 返回 301 到 /a。结果若日志中 /b 的抓取逐渐减少、/a 的抓取增加,说明取舍方向可能正确;若两者都减少,则要查是否误伤了其他入口,而不是继续加内容。
记录时至少保留:请求地址、状态码、Content-Type、Cache-Control、ETag、Last-Modified、Vary、Set-Cookie、正文长度、抓取时间。把这份记录与服务器日志对照,才能区分“响应头导致抓取端拿到不同版本”和“正文本身未被处理”。
robots.txt 的抓取限制不等于可靠的索引移除;站点地图不保证收录;HTTPS 也不保证页面一定被处理。把响应头记录、日志和站内链接三份材料放在一起,你才能决定下一步是改服务器配置、改链接入口,还是改正文。若响应头已经稳定指向唯一地址,而抓取端仍持续拿到同一份完整 HTML,再转向正文和站内重复问题,才不会把力气花错地方。