先看结论:HTTP 200 只说明请求被正常处理,不说明页面内容是正确结果。你要核对的是三组证据是否一致——响应行状态码、响应头中的内容类型与缓存字段、以及响应体里实际出现的文案与链接。三者矛盾时,以响应体与服务器配置日志为准,而不是以浏览器渲染出的好看页面为准。
假设你在一台共享型虚拟主机上部署了站点,访问一个不存在的路径 /old-page,浏览器显示的是自定义的“页面不存在”文案,但用命令行查看响应头,第一行是 HTTP/1.1 200 OK。直觉会说“页面能打开就行”,但搜索引擎把 200 理解为“这是一个正常存在的页面”,于是这个本不该存在的地址可能被当作有效内容处理。下面所有判断都围绕这一个情境展开,不涉及具体厂商的现行功能。
浏览器会把响应渲染成可视结果,容易掩盖状态码。你需要分别取证:
curl -I 或带查看网络面板的方式,只看第一行状态码和 Content-Type。curl -i 或直接查看源码,确认正文里是否真的出现了“未找到”“已删除”这类文案,以及正文长度是否接近一个真实页面。如果响应头是 200、正文却是错误提示,说明错误处理逻辑被放在了正常输出流程里,而不是返回错误状态。此时下一步动作是检查错误页面的生成方式,而不是去改文案。
同样是“错误页返回 200”,原因不同,处理位置也不同。可以用下面的证据组合来区分:
/old-page 时正文内容与首页高度相似,且日志里该路径被记成 200。这属于重写规则问题,需要检查规则里是否缺少对不存在路径的排除。Cache-Control 之类的错误页专用字段。这属于脚本层问题,需要在输出错误页时显式设置状态码。三种成因的修复动作完全不同:第一种改重写,第二种改脚本输出,第三种改缓存策略。先确定属于哪一种,再动手。
假设你判断是脚本没有设置状态码,于是在错误页脚本里补上了状态码设置。验证时不要只看一次结果,而要做对照:
如果第二项被破坏——正常页面也开始返回错误状态——说明改动范围过大,需要回退到只影响错误路径的条件。这个对照结果直接决定你是继续推进还是先缩小改动面。
状态码只是第一层。错误页面即使返回了正确的错误状态,仍有两个字段值得核对:
Content-Type:错误页如果被声明成与正文不符的类型,客户端可能无法正确渲染,也会影响后续处理方式。这两个字段不涉及收录承诺,但它们决定你下一次复查时看到的是新结果还是旧结果。如果错误页被长期缓存,你的验证动作需要先绕过缓存,否则证据不可信。
存在一种合理例外:某些软 404 设计出于特定交互需要,故意让不存在的资源返回 200 并展示引导内容。这种做法的前提是你明确知道自己在做软 404,并且不指望这些地址被当作不存在来处理。如果你并不确定自己是否属于这种情况,默认按错误状态处理更安全。判断依据不是“页面看起来像不像错误页”,而是“你是否主动选择了软 404 这一策略”。
把这个假设情境走完:先分开取响应行与正文,再用重写、脚本、缓存三类证据定位成因,改完后用存在与不存在两组路径做对照验证,最后检查内容类型与缓存字段。四步都留下可复查的结果,你才能确认内容与状态真正一致,而不是只看到页面能打开。