nginx的400错误bad request

nginx的400错误比较难查找原因,因为此错误并不是每次都会出现的,另外,出现错误的时候,通常在浏览器和日志里看不到任何有关提示。

经长时间观察和大量试验查明,此乃request header过大所引起,request过大,通常是由于cookie中写入了较大的值所引起。

所幸在nginx中是有办法解决这个问题:

在nginx.conf中,将client_header_buffer_size和large_client_header_buffers都调大,可缓解此问题。

其中主要配置是client_header_buffer_size这一项,默认是1k,所以header小于1k的话是不会出现问题的。

按我现在配置是:

client_header_buffer_size 16k;
large_client_header_buffers 4 64k;

这个配置可接收16k以下的header,在浏览器中cookie的字节数上限会非常大,所以实在是不好去使用那最大值。

最好的解决办法当然是不要往cookie里写入太多的东西,不过如果是一个很大的网站,那么在一个二级域名写入了顶级域名下的cookie似乎是不好控制的,这需要制定一个规范来控制顶级域名的cookie写入量才可以解决得了。

这个可能也是nginx的一个bug,因为buffer这个词义上说为缓冲,也就是说,如果没取完的话,是会循环取直至取完的,但是nginx并没有进行循环的动作直接返回了400错误。nginx的下一个版本可能会修正这个问题。

---

最近发现16k的buffer居然还是不够用,改成128k了,变态一点对nginx来说也不是很大问题,重要是人不能因为这种事情搞疯了

---

有朋友发现nginx在后台接收到很大的header时也会出现400错误,如:

2008/08/02 22:51:14 [error] 16613#0: *105 upstream sent too big header while reading response header from upstream, client: 。。。。。。。。。。。。。

在nginx的wiki里找了一遍,没有找到合适的语句,wiki更新过慢?于是查了一遍源码,在ngx_http_proxy_module.c也没有找到合适的语句。

不过在nginx 0.3.12版的更新里有这么一句话:

*) Change: the "proxy_header_buffer_size" and

   "fastcgi_header_buffer_size" directives was renamed to the

   "proxy_buffer_size" and "fastcgi_buffer_size" directives.

不清楚作者改名用意何在,不过,proxy_buffer_size之前的名字proxy_header_buffer_size倒是有点合适,如果有朋友老遇到后台接收时抛出400错误,可以增大这个参数一试。
Nginx 400 Bad Request是指在使用Nginx服务器访问网站或资源时,请求出现错误或无效,导致服务器无法正确处理请求,从而返回400 Bad Request错误响应。出现这种情况的原因通常是客户端发送的请求数据格式或参数错误,或者请求的资源不存在或被服务器拒绝访问。 要解决这个问题,我们需要排除以下几个可能的原因: 1. 请求数据格式错误。如果请求数据格式不正确,如头部数据错误,那么服务器将无法正确解析请求。此时,需要检查请求头、请求方法、请求参数等是否正确,并根据需要进行修正。 2. 请求参数错误。如果请求包含不合法的请求参数,例如访问不存在的页面、使用不支持的请求方法等,通常会导致400 Bad Request错误。解决这种情况需要检查请求参数是否正确,确保参数的数据类型、格式、取值范围等都符合要求。 3. 资源不存在或被服务器拒绝访问。如果请求的资源不存在,或者被服务器拒绝访问,那么就会出现400 Bad Request错误。解决这种问题需要确认请求的资源是否存在,以及是否被服务器正确配置和授权访问。 综上所述,出现Nginx 400 Bad Request错误是因为客户端提交的请求出现错误或无效。要解决这个问题,需要检查请求数据格式、请求参数、请求的资源等是否正确,确保这些因素都符合服务器的要求。另外,可以考虑使用Nginx日志来记录详细错误信息,以便在遇到问题时能够快速进行排除和修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值