一、问题描述
有时候在访问页面时会遇到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缓存,则进行清理。如果没有工具进行清理或者不便已清理的,则可以提供修复功能或者可以进行修复的页面。
②修改nginx服务器配置文件nginx.conf,增大请求缓冲,根据需要调整 client_header_buffer_size
和 large_client_header_buffers
:
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
发表评论