HTTPQUERY
English

413 Content Too Large

用法

收到 413 Content Too Large 错误消息时,说明客户端发送的请求体对服务器来说过大。一个常见例子是客户端尝试发送一个类型和格式均可接受、但大小超出限制的文件。例如,图片往往具有不必要的高分辨率,在不影响预期用途的前提下可以显著缩小。服务器不愿承担修改图片文件的责任,因此拒绝该传输,并依赖客户端来完成必要的处理。

在这些情况下,客户端会在发起 PUT 之前使用 Expect: 100-continue 头来预先检查文件大小是否被允许。服务器会予以确认,客户端据此发送或不发送消息体。

服务器可选择在响应中发送 Retry-After 头。若存在,客户端会在指定的时长之后,或在指定的时间和日期之后再次尝试请求。例如,如果客户端已超出本周的上传配额,或者高峰时段不允许大文件上传,服务器会建议在更合适的时间再试。

如果这种情况是因为服务器存储空间不足所致,那么服务器会改为发送 507。

服务器会包含 Connection: close 头以终止连接,防止客户端发送消息体。

注意

WAF 和 CDN 防火墙(Cloudflare、AWS WAF)会独立于源服务器强制执行消息体大小限制。如果源服务器的限制高于载荷大小,请检查 WAF/防火墙日志。减小载荷大小的选项:用 Content-Encoding: gzip 压缩、为大型结果集实现分页,以及对大文件使用分片或可续传上传。

SEO 影响

像 Google 这样的搜索引擎不会索引响应状态为 413 的 URL。此前已被索引的 URL 会从搜索结果中移除。

示例

客户端尝试发送一个文件,由于此刻流量繁重,服务器返回 413 Content Too Large。服务器拒绝请求、关闭连接,并建议客户端在 30 分钟后再试。

请求

PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000

响应

HTTP/1.1 413 Content Too Large
Retry-After: 1800
Connection: close
Content-Type: text/html
Content-Length: 188

<html>
  <head>
    <title>File Too Large</title>
  </head>
  <body>
   <p>Too much server traffic to accept the transfer
   at this time. Try again after 30 minutes.</p>
  </body>
</html>

如何修复

该错误源自技术栈中最先强制执行大小限制的那一层:Web 服务器、反向代理、CDN 或应用框架。找出返回 413 的那一层,并在该处调整限制。

nginx:在 http、server 或 location 块中设置 client_max_body_size。值为 0 会完全禁用该检查(不建议在生产环境中使用)。更改该值后重启 nginx。

Apache:在 httpd.conf 或 .htaccess 中设置 LimitRequestBody。该值以字节为单位,因此 10 MB 即 10485760。重新加载 Apache 以生效。

IIS:在 web.config 文件中 system.webServer > security > requestFiltering > requestLimits 下编辑 maxAllowedContentLength 属性。

PHP:在 php.ini 中同时调整 upload_max_filesize 和 post_max_size。post_max_size 的值必须大于或等于 upload_max_filesize。

Node.js / Express:在 body-parser 或 Express 内置的 JSON/URL 编码中间件中设置 limit 选项,例如 express.json({ limit: ‘50mb’ })。

Cloudflare:Free 和 Pro 套餐将上传上限设为 100 MB,Business 为 200 MB,Enterprise 为 500 MB。超出这些限制的上传会在到达源服务器之前返回 413。对于 Cloudflare 之后的大文件上传,绕过代理或使用分块上传策略。

在客户端侧,发送前压缩或分块处理大型载荷。对于文件上传,实现分片或可续传上传协议以保持在服务器限制之内。使用 Expect: 100-continue 机制,在传输完整消息体之前检查服务器是否会接受该载荷大小。

代码参考

.NET

HttpStatusCode.RequestEntityTooLarge

Rust

http::StatusCode::PAYLOAD_TOO_LARGE

Rails

:payload_too_large
:request_entity_too_large

Go

http.StatusRequestEntityTooLarge

Symfony

Response::HTTP_REQUEST_ENTITY_TOO_LARGE

Python3.5+

http.HTTPStatus.REQUEST_ENTITY_TOO_LARGE

Java

java.net.HttpURLConnection.HTTP_ENTITY_TOO_LARGE

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_REQUEST_TOO_LONG

Angular

@angular/common/http/HttpStatusCode.PayloadTooLarge