411 是什么
411 Length Required 表示服务器拒绝处理「没有声明请求体长度」的请求(RFC 9110 §15.5.12):通常是 POST 或 PUT 带有实体却没有 Content-Length,而服务器又不支持分块传输(chunked)。老旧 CGI、内置网关和部分硬件设备管理界面是最常见的来源;现代服务器大多支持 chunked,因此 411 已相对少见。
基本信息
| 名称 | 411 Length Required |
|---|---|
| 类别 | 4xx |
| 规范 | RFC 9110 §15.5.12 |
| 触发条件 | 有实体的请求缺少 Content-Length 且服务端不支持分块 |
| 现状 | 现代服务器多支持 chunked,411 较少见 |
| 互斥关系 | Content-Length 与 Transfer-Encoding 不能同时出现 |
典型使用场景
- 对接老网关或设备 API:上传接口报 411 时补上长度或改用分块
- 自研 HTTP 客户端:流式上传忘了设置长度会直接被拒
- 反向代理排查:上游要求长度、下游使用分块,代理需要做转换
- 协议实现者:理清 Content-Length 与 Transfer-Encoding 的互斥与优先级
- 自动化测试:用畸形请求验证服务端对长度缺失的处理
- 安全排查:请求走私防护依赖对这两个头的严格校验
补齐长度或改用分块
补齐长度或改用分块
# 显式声明长度(客户端库通常自动计算,手工设置必须保证准确)
curl -si -X POST https://legacy.example.com/upload \
-H 'Content-Length: 1048576' --data-binary @file.bin
# 或改用分块传输(需要服务端支持)
curl -si -X POST https://api.example.com/upload \
-H 'Transfer-Encoding: chunked' --data-binary @file.bin长度与编码相关
| 项 | 含义 | 要点 |
|---|---|---|
| Content-Length | 声明实体字节数 | 必须与实际一致,否则截断或挂起 |
| Transfer-Encoding: chunked | 不预声明长度、分块发送 | 不能与 Content-Length 同时出现 |
| 413 | 实体超过服务端上限 | 减小体积或调整服务端限制 |
| 501 | 方法本身不被支持 | 换方法或升级服务端 |
Content-Length 与 Transfer-Encoding: chunked 同时出现属于协议错误,部分服务器会直接拒收,防护请求走私的中间件通常也会拦截。
HTTP/2 与 HTTP/3 没有分块传输概念,长度由帧与 END_STREAM 表达,411 基本只出现在 HTTP/1.x 链路上。
服务端对长度缺失的拒绝应当是明确的 411,而不是把请求体当空处理,后者会造成很难排查的数据丢失。
流式上传若不声明长度,需先确认服务端确实支持 chunked;否则应在客户端把内容缓冲到临时文件后再发送。