首页/网络/协议速查/原因短语与非标准状态码
HTTP 方法与状态码91 条

原因短语与非标准状态码

状态行里的原因短语(Reason-Phrase)只是给人看的文本,历史上可自定义;HTTP/2 起状态行被移除。

协议速查网络更新于 2026-10-13

原因短语是什么

HTTP/1.1 状态行由三部分组成:版本、三位状态码、原因短语(Reason-Phrase),例如 200 OK 中的 OK。短语只是给人看的可读文本,规范明确客户端不得依赖它做判断;HTTP/2 起状态行被取消,只有 :status 这个伪头部携带数字。理解这一点,就不会再试图靠改短语去「让程序识别错误」。

基本信息

组成HTTP/1.1 200 OK —— OK 即原因短语
规范RFC 9110 §15(短语由实现自由填写,客户端不得依赖)
HTTP/2 及以上只有 :status 数字,没有原因短语与状态行
常见非标准码Nginx 私有 444、495、496、497、499

Nginx 私有状态码

状态码含义典型场景
444直接关闭连接不回响应拦截恶意扫描、隐藏服务
495客户端证书错误双向认证失败
496需要客户端证书未提供证书
497HTTP 请求发到了 HTTPS 端口协议用错端口
499客户端提前关闭连接上游超时或用户取消,只出现在访问日志

观察与自定义

观察与自定义
curl -si https://example.com/ | head -1        # 看完整状态行与短语
curl -si https://example.com/ | head -1 | cat -A  # 确认短语后的 CRLF
# 修改短语需第三方模块(more_headers 等),不建议依赖
# 应用侧要可读错误就把说明放进响应体 JSON,而不是改短语

典型使用场景

  • 读日志时区分「框架自造的状态码」与标准码,避免把 499 当成标准响应处理
  • 排查反向代理异常:495 到 497 基本可以确定是 TLS 或证书配置问题
  • 对接老客户端时确认其是否真的解析了短语,多数库只认数字
  • 设计 API 错误约定时把说明放进响应体,而不是自定义短语
499 是 Nginx 自己记账用的:它表示客户端在服务器给出响应前就断开,通常意味着上游太慢或用户取消,抓包时看不到这个码被真正发给客户端。
HTTP/2 与 HTTP/3 中没有状态行,抓包工具展示的「状态短语」是工具按数字表反查补上的,看到的文本并不来自服务端。

易错点

  • 用原因短语做程序判断:代理可以改写、HTTP/2 根本不存在该字段,逻辑会随链路变化而失效
  • 把 Nginx 的 499 当成标准的客户端错误:它不出现在响应里,只写在访问日志,监控口径和客户端上报对不上
  • 自定义短语却忘了空格与 CRLF 格式要求,改造中间件时容易产出非法状态行,导致客户端直接断开
  • 把 444 当成「安全的拦截」:它只关闭连接,攻击者仍可感知端口存活,真正的隐藏需要结合默认站点与限速策略

数据来源与参考

  • RFC 9110 §15(状态行与短语)
  • Nginx 官方文档(444/499 等)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌