HTTPQUERY
English

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