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