面试的时候被问到 444 状态码是什么了,很丢人,没回答出来,因为我没见过。回来就开始百度了,一查才知道,这个状态码不常见,至少不玩 nginx 的是不常见的,因此记录一下。
一、什么是状态码(Status Code)
总所周知,状态码是 HTTP 响应报文里用 3 位数字 告诉客户端「服务器处理结果」的字段。让浏览器/APP/前端代码 快速判断请求成功还是失败,并决定下一步动作(渲染、重试、弹错、跳转)。
二、前端常见状态码
| 类别 | 范围 | 英文 | 中文含义 |
|---|---|---|---|
| 1xx | 100-199 | Informational | 继续等待 |
| 2xx | 200-299 | Success | 成功 |
| 3xx | 300-399 | Redirection | 重定向 |
| 4xx | 400-499 | Client Error | 客户端错误 |
| 5xx | 500-599 | Server Error | 服务器错误 |
三、什么是444状态码
| 字段 | 内容 |
|---|---|
| 来源 | Nginx(官方模块 ngx_http_proxy_module) |
| 类型 | 非 RFC、非 IETF、非 W3C |
| 触发条件 | 当 Nginx 主动关闭连接且不想向客户端返回任何响应时 |
| 浏览器看到的现象 | Network 面板标红,但 Response Headers 为空,大小 0 B |
| 本质 | 不是 HTTP 响应,而是 “连接被直接掐掉” 的占位符 |
所以本质上 444 是 Nginx 自己用的“内部暗号”,告诉管理员“我拒绝处理,但连 400 都懒得给”。 前端无法“捕获”444,只能把它视为 网络失败 的一种。你要想找到这个码,你就只能去翻nginx的日志,你才能看到。
什么时候会出现444状态码的情况
| 触发条件 | 现场命令 / 配置片段 | 结果 |
|---|---|---|
| 1. 非法 Host 头 | curl -H "Host: evil.com" http://your-ip | Nginx 日志出现 ... 444 0 |
| 2. 扫描器 UA 黑名单 | curl -A "sqlmap/1.0" http://your-ip | 同上 |
| 3. 缺失 User-Agent | curl -A "" http://your-ip | 同上 |
| 4. IP 黑名单 | deny 192.168.1.100; | 同 IP 访问即 444 |
即请求时判定你这个的请求不安全时。因此,在爬虫用户中可能会比较常见这个场景。