客户wordpress网站,使用万维景盛的安心主机,在使用elementor可视化智能编辑器编辑网站时,遇到400 Bad request的报错。什么原因呢?万维景盛工程师为您分享解决问题的方案。
网上一般的解释是,Your browser sent a request that this server could not understand
Size of a request header field exceeds server limit.是由于请求头中content-length太大,Apache没有接收造成报错。
我们来了解一下相关知识。
原因1:没有转义字符,特殊符号String类型不能接收
原因2:浏览器对传的参数长度有限制
我们在访问接口时的URL是有长度限制的!!!
浏览器:
IE浏览器对URL的长度现限制为2048字节(自己测试最多为2047字节)。
360极速浏览器对URL的长度限制为2118字节。
Firefox(Browser)对URL的长度限制为65536字节。
Safari(Browser)对URL的长度限制为80000字节。
Opera(Browser)对URL的长度限制为190000字节。
Google(chrome)对URL的长度限制为8182字节。
服务器:
1、apache
apache能接受url长度限制为8192字节
2、IIS
Microsoft Internet Information Server(IIS)能接受url长度限制为16384个字节。
这个是可以通过修改的(IIS7)configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryString setting.
3、Perl HTTP::Daemon
Perl HTTP::Daemon 至少可以接受url长度限制为8000字节。Perl HTTP::Daemon中限制HTTP request headers的总长度不超过16 384字节(不包括post,file uploads等)。但当url超过8000字节时会返回413错误。
这个限制可以被修改,在Daemon.pm查找16×1024并更改成更大的值。
4、ngnix
可以通过修改配置来改变url请求串的url长度限制。
client_header_buffer_size 默认值:client_header_buffer_size 1k
large_client_header_buffers 默认值 :large_client_header_buffers 4 4k/8k
由于jsonp跨域请求只能通过get请求,url长度根据浏览器及服务器的不同而有不同限制。
若要支持IE的话,url长度限制为2083字节,若是中文字符的话只有2083/9=231个字节。
若是Chrome浏览器支持的最大中文字节只有8182/9=909个。
这些数据引用自:https://blog.csdn.net/zimuxin/article/details/78082747
我这边是在本地服务通过接口调用远程服务,情况符合服务器-Apache这一项,我的参数长度已经超过限制了,其中一个参数有1786个四位数的数字,换算成字节就是178648,远远大于限制,所以才会报400 Bad Request的异常!!!
原因3:试着改成POST请求再试试,因为某些情境必须使用post请求方式
原因4:前台传的数据类型和后台接收的类型不一致,比如时间类型转换问题,当类型是Data类型时,要配置全局类型转换
Apache中“资源使用限制”就是要限制用户对网站特定资源(如目录、服务器硬件等)的访问。相关指令包括:LimitRequestBody、LimitRequestFields、LimitRequestFieldSize、LimitRequestLine、RLimitCPU、RLimitMEM、RLimitNPROC和ThreadStackSize。LimitRequest*系列指令用来限制Apache在读取客户端请求的过程中使用的资源数量。通过限制这些值,可以减轻某些拒绝服务(DOS)攻击;RLimit*系列指令限制被Apache子进程所派生的进程使用的资源数量,通常这些指令用来控制CGI脚本和SSI exec命令所使用的资源;ThreadStackSize指令在某些平台上用来控制堆栈大小。
LimitRequestLine
LimitRequestLine指令用来限制接收客户端发送的HTTP请求行的字节数,允许服务器管理员增加或减少客户端HTTP请求行允许大小的限制。因为请求行包括HTTP方法、URI、协议版本,所以LimitRequestLine指令会限制请求URI的长度。服务器会需要这个值足够大以装载它所有的资源名,包括可能在GET请求中所传递的查询部分的所有信息。
LimitRequestFieldSize
LimitRequestFieldSize指令用来限制客户端发送的请求头的字节数,允许服务器管理员增加,或减少HTTP请求头域大小的限制。一般来说,服务器需要此值足够大,以适应普通客户端的任何请求的头域大小。一个普通头域的大小对于不同的客户端来说是有很大差别的,一般与用户配置他们的浏览器以支持更多的内容协议密切相关。
LimitRequestLine和LimitRequestFieldSize指令给了服务器管理员更大的可控性,以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。默认值为“8190”。
解决
在Apache的httpd.conf配置文件中新增下面2行代码
LimitRequestLine 40940
LimitRequestFieldSize 40940
然而经检查发现,APACHE,php给请求头的限制并不小,突然想起apache在获取请求头之前,要经过waf来过滤,那么是不是被waf给拦截了呢?果然,关闭waf后,一切正常了!
最后,将被拦截的url^/wp-admin/admin-ajax.php放入waf拦截的url白名单解决问题。