请求实体超出服务器限制导致post方法报413

发布于:2025-07-08 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

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查了一下,区别如下:

表述方式 典型触发场景
413 Request Entity Too Large 旧版服务器(如Nginx/Apache)的默认错误提示,常见于文件上传、POST请求过大。
413 Content Too Large 某些框架(如Spring)或CDN的自定义错误消息,语义与 Payload Too Large 相同。
413 Payload Too Large 现代HTTP标准术语,涵盖所有请求体过大的情况(如JSON、文件、表单数据)。

那文件上传云存储服务的数据量更大,为啥没有报错呢?去查看文件上传的代码,上传到公司内云服务,单文件限制5GB,太大的文件可以采用分块上传

2.1 请求体限制来源

(1) 服务器配置
服务器/框架 默认限制 配置方法示例
Nginx 1MB client_max_body_size 100M;
Apache 2GB (编译时默认) LimitRequestBody 104857600 (100MB)
Tomcat 2MB (表单提交) maxPostSize="20971520" (20MB)
Spring Boot 1MB (文件上传) spring.servlet.multipart.max-file-size=10MB
(2) 客户端限制
  • 浏览器:无硬性限制,但大文件可能导致内存溢出或超时。
  • 编程语言 HTTP 库:
    • Python requests:无内置限制,但受内存限制。
    • Node.js http:默认约 16KB 缓冲区,需手动处理流式上传。
(3) 网络环境
  • 代理/网关:如 Cloudflare 默认限制 100MB。
  • CDN:可能限制单次请求体大小(如 AWS CloudFront 默认 20GB)。

由以上分析,1.2M被限制很可能是Nginx与Spring Boot限制。

3. 解决方式

  1. 客户端调整
    • 减少请求体大小(如压缩数据、分片上传)。
    • 检查 Content-Length 或 Transfer-Encoding 头部是否合法。
  2. 服务器调整
    • 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

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。

修改->审批->测试,没问题

其它方案:本来是想在前端对请求实体进行压缩,然后在服务端解压处理。


网站公告

今日签到

点亮在社区的每一天
去签到