411 Length Required
用法
收到 411 Length Required 错误消息时,必须在包含 Content-Length 头的情况下重新提交请求。HTTP 请求通常用此头来指定消息体的长度,但并非总是如此。例如,当包含 Transfer-Encoding 头字段并将其设为 chunked 时,就不需要 Content-Length 头字段。
如果客户端正在发送数据流并返回此状态,则数据必须改为以指定大小的块发送。
SEO 影响
像 Google 这样的搜索引擎不会索引响应状态为 411 Length Required 的 URL。此前已被索引的 URL 会从搜索结果中移除。返回此状态码的页面不会消耗抓取预算。
示例
客户端尝试发送一个文件,但由于未指定消息体长度,服务器以 411 Length Required 拒绝了该请求。
请求
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
<PDF file included as message body>
响应
HTTP/1.1 411 Length Required
如何修复
添加一个 Content-Length 头,其值为请求体的确切字节数。大多数 HTTP 客户端库在发送字符串或缓冲区时会自动计算此值。核实该库没有剥离该头或将其值设为零。
当请求使用分块 Transfer-Encoding 时,说明目标服务器不接受分块消息体。先缓冲完整载荷、测量字节长度,然后改为带 Content-Length 头发送消息体。
代理和防火墙有时会在传输途中剥离或修改头。如果客户端正确发送了 Content-Length 但服务器仍返回 411,请在服务端检查请求,确认该头完好无损地送达。
在 curl 中,-d 标志会自动设置 Content-Length。对于 curl 的 Transfer-Encoding: chunked,使用 -H “Transfer-Encoding: chunked”,但仅在服务器支持分块传输时才这样做。
在服务端,此状态常由严格的配置或不支持分块编码的较旧 HTTP/1.0 服务器返回。是服务器管理员有意设定了此策略,修复始终在客户端一侧。
API 测试工具中的 411
Postman 和 curl 等工具对大多数请求类型会自动处理 Content-Length 头。Postman 中出现 411 错误,通常是在对 POST 或 PUT 请求发送空消息体、又未选择消息体类型时发生的。选择一种消息体格式(raw、form-data 或 x-www-form-urlencoded)会使 Postman 正确设置 Content-Length 头。
代码参考
.NET
HttpStatusCode.LengthRequired
Rust
http::StatusCode::LENGTH_REQUIRED
Rails
:length_required
Go
http.StatusLengthRequired
Symfony
Response::HTTP_LENGTH_REQUIRED
Python3.5+
http.HTTPStatus.LENGTH_REQUIRED
Java
java.net.HttpURLConnection.HTTP_LENGTH_REQUIRED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_LENGTH_REQUIRED
Angular
@angular/common/http/HttpStatusCode.LengthRequired