指南 / Web

网站返回了 200 OK。唯一的问题是,它一点也不 OK。

HTTP 200 只表示服务器成功返回了某个响应。这个响应依然可能是错误页、旧内容,甚至完全错误的应用。

发布 · 更新 · 9 MIN

部署完成。

健康检查通过。

监控面板全绿。

200 OK

非常好。

打开网站。

页面上写着错误。

从服务器角度,它成功了。从人的角度,没有任何人成功。

这就是一个重要但很容易忘掉的事实:200 OK 不等于你的应用 OK。

状态码描述的是 HTTP 响应

浏览器请求页面时,服务器不只发送 HTML,还会发送状态和响应头:

HTTP/1.1 200 OK
Content-Type: text/html

常见状态码大致分为:

2xx 成功
3xx 重定向
4xx 请求或权限问题
5xx 服务端问题

这个分类很有用,但状态码并不会打开 HTML 看一眼再判断你业务逻辑是不是正常。

“页面写 404,状态却是 200”

服务器完全可以返回:

HTTP/1.1 200 OK

正文却是:

<h1>404 - Page Not Found</h1>

人看到的是 404,HTTP 客户端看到的是 200。这类缺失页面如果仍返回成功状态,通常称为 soft 404。

搜索引擎可能尝试识别它,但监控系统未必会。它看到 200,就可能开心地打勾。

SPA 特别容易制造这种情况

单页应用通常把多个路径都交给同一份 index.html,再由前端路由决定显示什么。服务器配置常见逻辑是:

文件不存在 → 返回 index.html

于是访问一个根本不存在的 URL,服务器依然成功返回 index.html,状态码 200;应用加载后再显示“Page not found”。

协议和页面各自都很自洽,合起来却给搜索引擎和监控留了谜语。

CDN、Worker 和代理还会继续加戏

现代站点常见链路:

Browser
↓
CDN
↓
Worker / proxy
↓
Origin
↓
Application

每一层都可能缓存、改写、重定向或替换错误页面。源站返回 500,代理捕获后给用户展示友好错误页,如果代理顺手把状态改成 200,监控就会宣布世界和平。

几个常见状态码

只判断 status === 200 的健康检查很容易被骗

const response = await fetch(url);
if (response.status === 200) {
  console.log("Healthy");
}

它只证明 URL 回了 200。

更实用的检查可以同时验证:

例如检查真实生产域名是否包含自己的品牌标志,比只检查 Pages 内部部署 URL 更接近用户实际看到的东西。

“正确失败”也是健康的一部分。不存在的页面返回真正的 404,通常比一张写着 404 的 200 页面更健康。

SEO 也会看状态

页面永久搬家,就用合适的重定向;内容不存在,就返回 404 或 410。不要把所有路径都包装成 200,再期待搜索引擎替你猜真实含义。

最后

状态码是 HTTP 交易的元数据,非常重要,但它不是读心术。

200 OK 的真实含义更接近:

“服务器成功给了你某个东西。”

它并没有承诺数据库活着、JS 正常、登录有效、部署版本正确,也没有承诺用户今天心情很好。

所以检查状态码。

然后检查内容。

最危险的错误页面,有时正戴着一枚绿色的 200 OK 徽章。