Nginx表单内容包含文件转成base64超长字符串,导致表单提交异常

问题:Nginx表单内容包含文件转成base64超长字符串,导致表单提交异常

nginx 配置

location /DesktopModules/InfoPublicV1/API/ {

     proxy_buffer_size 4096k;
     proxy_buffers 16 1024k;
     client_max_body_size    10m;
     client_body_buffer_size 4096k;
     client_body_timeout  600;
     proxy_pass  http://www.baidu.com/release/;
}

请求参数

Content 内容是图片转成base64字符串

img

排查过程
1.在access.log并未发现请求记录;
2.在error.log也未发现异常记录;
3.如果不通过nginx代理 直接通过postman请求目标地址接口是通的。通过Nginx转发就会请求失败;
4.Content内容如果是非base64超长字符串,也能请求成功;

恳求各位帮忙,困扰一周了。

上传的文件多大,就是修改nginx配置。

client_max_body_size 0;

设置为0不限制大小

client_max_body_size设置大一点

哈哈哈 是不是字符过长了, 把图片base64 改下或者 接收参数长度改下试试, 但是如果字符过长 会报错, 你没报错吗

基于new bing部分指引作答:
根据您提供的信息,有两个可能的原因导致通过 Nginx 转发包含超长 base64 字符串的表单提交失败。

1、客户端请求大小限制:
在您的 Nginx 配置中,client_max_body_size 设置为 10MB。如果表单提交的内容超过这个大小,Nginx 会拒绝请求并返回错误。请确保表单提交的数据大小不超过该限制。

2、Nginx 缓冲区设置:
在您的 Nginx 配置中,proxy_buffer_size 和 proxy_buffers 控制代理缓冲区的大小。如果缓冲区太小,可能导致数据无法完全缓冲,从而导致表单提交失败。您可以尝试增加这些值来扩大缓冲区大小,以容纳更长的 base64 字符串。

例如,您可以将 proxy_buffer_size 设置为更大的值,例如 8m,并将 proxy_buffers 设置为 32 8m,以便更好地处理包含超长 base64 字符串的表单提交。

另外,请确保在进行这些更改后重新加载或重启 Nginx 服务器,以使配置更改生效。

请注意,如果您的 base64 字符串非常长,它可能会超过 HTTP 请求的大小限制,即使 Nginx 的配置已经更改。在这种情况下,您可能需要考虑其他方法来处理和传输包含大量数据的表单,例如使用分块上传或直接上传文件而不是将其转换为 base64 字符串。

试试

client_max_body_size 0;  不限制
proxy_buffering off; #禁用代理缓冲区
proxy_read_timeout 600; #设置代理读取超时时间为600proxy_send_timeout 600; #设置代理发送超时时间为600

提供一个解决思路,将前端的表单提交改掉。可以参考
https://www.cnblogs.com/zhaoyingjie/p/8451946.html

根据你提供的信息来看,表单内容包含文件转成的超长 base64 字符串导致通过 Nginx 转发请求失败。有几个可能的原因和解决方法如下:

  1. Nginx 缓冲区设置不足:尝试增加 proxy_buffer_sizeproxy_buffers 的值,确保缓冲区大小足够容纳超长的 base64 字符串。例如:
proxy_buffer_size 8192k;
proxy_buffers 32 8192k;
  1. 客户端请求体大小限制:在你的配置中已经设置了 client_max_body_size 为 10MB,但是如果超长的 base64 字符串超过了这个限制,会导致请求被拒绝。你可以尝试增加 client_max_body_size 的值来适应更大的请求体。
client_max_body_size    100m;
  1. 请求超时设置:可能是由于请求体过大或者处理时间过长导致超时。你可以尝试增加 client_body_timeout 的值,使得 Nginx 在更长的时间内等待请求完整。
client_body_timeout  120s;

请注意,这些配置需要根据实际情况进行调整,确保适应你的具体场景。另外,如果问题仍然存在,建议查看 Nginx 的错误日志,以获取更详细的错误信息,并排除其他潜在问题。

access.log/error.log如果没有信息,是不是你URL写的有问题,访问URL报啥错