先给结论:当错误页面返回 200 而不是 4xx 或 5xx 时,不要只看浏览器里显示了什么,而要把“响应状态”“页面正文”“主机层返回内容”三者分开取样,再判断哪一层说了假话。核对的目标不是证明某个工具错了,而是找出状态码与内容在哪一层开始分叉,从而决定下一步是改主题、改服务器规则,还是改缓存策略。
浏览器和多数可视化工具会优先渲染正文,状态码往往被折叠或忽略。一个显示“文章不存在”的页面,完全可能带着 200 返回;反过来,一个 404 也可能因为主机层的自定义错误文档而显示成正常页面。这两种情况方向相反,处理方式也不同。
判断分叉点需要三个独立样本:
curl -I 只看响应头,记录状态码,不看正文。curl -s 只看正文,确认返回的到底是错误模板还是正常内容。如果响应头是 200、正文是错误提示,说明内容层已经把错误“正常化”了;如果响应头是 404、正文却是完整文章,说明状态码被错误地套在了有效内容上。两种情况的修复入口不在同一处。
先拿一个你确信应该报错的地址做样本,例如一个不存在的文章别名。记录三件事:状态码、正文首行文字、响应头里是否出现缓存命中标记。然后换一个你确信应该正常的地址,重复同样记录。
如果错误样本返回 200,而正常样本也返回 200,问题多半出在主题的 404 模板或主机层的错误文档配置上,而不是内容本身。此时动作是:检查当前主题的 404.php 是否存在且被正确调用,再检查主机是否把自定义错误页设置成了“始终返回 200”。这个动作的结果会直接决定下一步——如果模板缺失,补模板;如果主机层强制 200,改主机配置或换错误文档处理方式。
如果错误样本返回 404,但正文是正常文章,说明重写规则或缓存把不同请求混在了一起。此时不要急着改状态码,先清掉该 URL 的缓存再复测。缓存清除后如果状态码恢复正常,说明问题在缓存层;如果依旧,说明重写规则有冲突。
单个样本修好不代表整站一致。当站点有大量动态参数、多语言目录或分页时,同一套规则可能在部分路径上成立、在另一些路径上失效。判断能否照搬的关键,是看例外是否集中在同一类请求上。
可以按下面这组条件区分:
这里要说明一个容易误判的现象:抓取日志里某类错误 URL 的请求量下降,不能单独证明状态码已经修对。它也可能是抓取频率整体下降、robots.txt 限制生效,或该路径本来就没有内链。要确认修复有效,仍需回到响应头和正文的一致性上。
假设某站点把“商品已下架”页面统一返回 200,理由是“用户看到提示就够了”。短期看,单个页面在浏览器里表现正常;规模化后,站内搜索和分页开始把大量下架页当作有效内容收录进列表。此时如果只改主题模板,把提示文字换成 404 样式,状态码仍然是 200,问题不会消失。
可执行的顺序是:先确认这些下架页应该返回 410 还是 404,再在生成该页面的逻辑里显式设置状态码,最后用同一批 URL 复测响应头和正文。复测通过后,再观察站内搜索和分页是否还引用这些地址。这个顺序把“改外观”和“改语义”分开,避免用样式掩盖状态码错误。
第一,把 robots.txt 的抓取限制当成索引移除手段。限制抓取不等于页面会从索引中消失,状态码与内容的一致性仍然要单独核对。第二,把站点地图当成收录保证。地图里列出的 URL 如果返回 200 但内容是错误页,反而会扩大问题范围。第三,把 HTTPS 当成安全或排名保证。证书有效不改变状态码与正文是否一致这一事实,该查的响应头仍要查。
不同搜索引擎对 410、404 和软 404 的处理并不完全相同,核对时应分别查看各自的实际抓取与索引表现,而不是用一套结论覆盖所有情况。最终要落到一个可复查的动作上:固定一批样本 URL,记录状态码与正文首行,修改后重跑同一批样本,用前后差异决定是否继续扩大修改范围。