PHP 返回 JSON 时需手动设置 HTTP 状态码,因状态码属响应头、JSON 属响应体;应优先用 http_response_code() 在输出前设定,避免与 header() 混用,并注意前端需主动校验状态码。

PHP 返回 JSON 时 HTTP 状态码不自动同步
HTTP 状态码和 JSON 数据是两层东西:状态码属于响应头(header() 控制),JSON 是响应体(echo json_encode(...) 输出)。PHP 不会因为你返回了 {"error": "not found"} 就自动设成 404——这得你手动指定。
用 http_response_code() 设置状态码再输出 JSON
这是最直接、兼容性最好的方式。注意它必须在任何输出之前调用,否则会报 Warning: Cannot modify header information。
-
http_response_code(200)和http_response_code(404)都有效,无需额外header("HTTP/1.1 404 Not Found") - 如果用了框架(如 Laravel、Slim),优先走框架的响应构造方法,避免手动调用
http_response_code() - CLI 模式下
http_response_code()无效,只对 Web SAPI(如 Apache、FPM)起作用
http_response_code(400);
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['message' => 'Invalid parameter']);
// 输出:HTTP/1.1 400 Bad Request + JSON body
别混用 header() 和 http_response_code() 冲突
两者都能改状态码,但顺序和覆盖逻辑容易出错。例如:
- 先调
http_response_code(500),再调header("HTTP/1.1 200 OK")→ 最终是 200 - 先调
header("HTTP/1.1 404 Not Found"),再调http_response_code(200)→ 最终是 200(PHP 7.4+ 行为) - 推荐只用
http_response_code(),语义清晰、不易误写
前端拿到 4xx/5xx 状态码不一定触发 catch
Fetch API 默认不会因 HTTP 错误状态码 reject,需手动检查 response.ok 或 response.status;Axios 则默认把非 2xx 当作错误抛出。后端设了 401,但前端 fetch 不判断 ok,就会把错误 JSON 当正常数据解析,导致静默失败。
立即学习“PHP免费学习笔记(深入)”;
真正容易被忽略的是:状态码只是信号,是否按错误处理,取决于客户端怎么读——后端设对了,前端没接住,等于白设。











