请求实体超出服务器限制导致post方法报413_post 413
目录
1. 背景
2. 分析
2.1 413码的含义
2.1 请求体限制来源
(1) 服务器配置
(2) 客户端限制
(3) 网络环境
3. 解决方式
4. 实际解决
1. 背景
前端有个数据转换的功能,需要将接口的response参数进行解密,由于response数据太大,导致POST方法报413。
request header中显示实体大小为1225231字节,约1.2M数据
Content-Length:指定消息主体的字节长度,用于告知接收方需要读取多少字节的数据
2. 分析
2.1 413码的含义
上网查一下,发现413码的描述各不相同,有\"413 Request Entity Too Large\",有\"413 Payload Too Large\",用AI查了一下,区别如下:
Payload Too Large
相同。那文件上传云存储服务的数据量更大,为啥没有报错呢?去查看文件上传的代码,上传到公司内云服务,单文件限制5GB,太大的文件可以采用分块上传
2.1 请求体限制来源
(1) 服务器配置
client_max_body_size 100M;
LimitRequestBody 104857600
(100MB)maxPostSize=\"20971520\"
(20MB)spring.servlet.multipart.max-file-size=10MB
(2) 客户端限制
- 浏览器:无硬性限制,但大文件可能导致内存溢出或超时。
- 编程语言 HTTP 库:
- Python
requests
:无内置限制,但受内存限制。 - Node.js
http
:默认约 16KB 缓冲区,需手动处理流式上传。
- Python
(3) 网络环境
- 代理/网关:如 Cloudflare 默认限制 100MB。
- CDN:可能限制单次请求体大小(如 AWS CloudFront 默认 20GB)。
由以上分析,1.2M被限制很可能是Nginx与Spring Boot限制。
3. 解决方式
- 客户端调整:
- 减少请求体大小(如压缩数据、分片上传)。
- 检查
Content-Length
或Transfer-Encoding
头部是否合法。
- 服务器调整:
- Nginx: 修改
client_max_body_size
:
http { client_max_body_size 20M; # 允许最大20MB的请求体 }
- Apache: 设置
LimitRequestBody
:
LimitRequestBody 10485760 # 允许最大10MB
- Spring Boot: 配置
spring.servlet.multipart.max-request-size
。
- Nginx: 修改
4. 实际解决
发现Spring Boot已经设置了很大了,所以排除是Spring Boot服务端限制,现在只剩下Nginx限制了,线上环境Nginx中没有配置client_max_body_size,默认是1M
test环境和预发环境的Nginx有配置client_max_body_size,如下:
在test环境和预发环境进行数据转换,确实没有报413,至此原因已经找出,需要将线上的Nginx配置中增加client_max_body_size,根据日常的数据量大小,可以配置为5M。
修改->审批->测试,没问题
其它方案:本来是想在前端对请求实体进行压缩,然后在服务端解压处理。