一、问题描述
有时候在访问页面时会遇到400 Bad Request(Request Header Or Cookie Too Large)错误,如下图所示:
二、可能性分析
先了解一下关于400 Bad Request状态码的解释:
由于明显的客户端错误(例如,格式错误的请求语法,太大的大小,无效的请求消息或欺骗性路由请求),服务器不能或不会处理该请求。
结合Request Header Or Cookie Too Large,可以知道可能是:
由request header过大所引起,request过大,通常是由于cookie中写入了较大的值所引起的。(如果不清楚cookie是什么,点击查看 Cookie的相关知识
)
三、代码走查
搜索document.cookie,可以看到如下代码:
重点看上述代码第52行,document.cookie = …
这段代码会被反复运行,并且可能会有不同的 companyId|token
的key值出现。这就有可能导致多次运行后cookie太大。
四、问题重现与验证
如何简单的重现问题呢?根据cookie的相关知识,我们可以访问同一域名下的随便一个可访问的页面,然后通过浏览器控制台运行一个循环对document.cookie进行反复赋值(key值不同的cookie),最后刷新页面就可以看到。
for(var i = 0; i<40; i++) {
document.cookie = "Ij7I"+i+"|token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2twYXBpLWNzLmNranIwMDEuY29tL2FwaS9wYy9sb2dpbi9oYXNRcmNvZGVMb2dpbmVkIiwiaWF0IjoxNjUyNjY1NzEyLCJleHAiOjE2NTUyNTc3MTIsIm5iZiI6MTY1MjY2NTcxMiwianRpIjoiaUxBY2M1TmZrTE0weENFeiIsInN1YiI6bnVsbCwiYyI6ImxqN2wiLCJ1IjoiOHhnNzhqbjkifQ.Q45s4lwTaS5Z1zo94ugt0QRVZNb0HIjvvt7m2GHjtYQ"+"i"
}
最终结果:
为什么会这样呢?我们来了解一下documet.cookie。
先思考:可否直接使用document.cookie=''来清空cookie?
答案是不可以。原因就是,document.cookie = newCookie
只能对一个cookie进行设置(新增)或更新,它与我们对变量的重新赋值虽然在形式上是一样,但实质结果是不一样的。
解决方案
第一步:修正代码错误,正确删除cookie。
第二步:消除客户端影响。对于已造成影响的客户端,要区分情况处理:
①如果客户端能清理cookie缓存,则进行清理。如果没有工具进行清理或者不便已清理的,则可以提供修复功能或者可以进行修复的页面。文章来源:https://www.toymoban.com/news/detail-767126.html
②修改nginx服务器配置文件nginx.conf,增大请求缓冲,根据需要调整 client_header_buffer_size
和 large_client_header_buffers
:文章来源地址https://www.toymoban.com/news/detail-767126.html
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
到了这里,关于HTTP:400 Request Header Or Cookie Too Large的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!