部署完成。
健康检查通过。
监控面板全绿。
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,监控就会宣布世界和平。
几个常见状态码
- 200:请求成功返回响应,不保证内容正确。
- 301:永久重定向,浏览器和搜索引擎可能记得很牢。
- 302:临时重定向。
- 304:缓存版本仍然有效,不需要重发正文。
- 400:请求格式或内容有问题。
- 401:通常表示需要认证或认证失败。
- 403:理解请求,但拒绝执行。
- 404:资源不存在。
- 429:请求过多,通常撞上限流。
- 500:服务端内部错误。
- 502:网关从上游拿不到有效响应。
- 503:服务暂时不可用。
只判断 status === 200 的健康检查很容易被骗
const response = await fetch(url);
if (response.status === 200) {
console.log("Healthy");
}它只证明 URL 回了 200。
更实用的检查可以同时验证:
- 最终状态码。
- Content-Type。
- 页面里应当存在的标志。
- 不应该出现的挑战页或错误提示。
- 关键 API 的结构化健康状态。
例如检查真实生产域名是否包含自己的品牌标志,比只检查 Pages 内部部署 URL 更接近用户实际看到的东西。
SEO 也会看状态
页面永久搬家,就用合适的重定向;内容不存在,就返回 404 或 410。不要把所有路径都包装成 200,再期待搜索引擎替你猜真实含义。
最后
状态码是 HTTP 交易的元数据,非常重要,但它不是读心术。
200 OK 的真实含义更接近:
“服务器成功给了你某个东西。”
它并没有承诺数据库活着、JS 正常、登录有效、部署版本正确,也没有承诺用户今天心情很好。
所以检查状态码。
然后检查内容。
最危险的错误页面,有时正戴着一枚绿色的 200 OK 徽章。