欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

cnzz统计代码引起的Bad Request - Request Too Long的原因分析

程序员文章站 2022-03-19 11:09:55
用Chrome打开某些博客文章时,会出现Bad Request - Request Too Long. HTTP Error 400. The size of the request headers is too long.的错误页面... 14-01-24...

问题起因

今天一位网友向我们反馈,用chrome打开某些博客文章时,会出现"bad request - request too long. http error 400. the size of the request headers is too long."的错误页面:

cnzz统计代码引起的Bad Request - Request Too Long的原因分析

用ie, firefox都没问题,唯有chrome。

之前我们遇到过一次这样的问题,当时以为是偶然因素引起的chrome问题,于是在"%localappdata%\google\"中将chrome的配置文件重命名,让chrome重建配置,解决了问题。

今天,这个问题再次出现,就不能忽视了,必须找出问题的真正原因并找到解决办法。

解决过程

开始我们推测,可能是某些原因造成chrome发出的请求头包含过多内容。查看chrome请求的网址是正常的,也没发现request header的异常。既然没在chrome找到问题的原因,那我们从服务端下手吧,请求长就长一点,只要能让用户看到正常的内容。

服务端iis究竟在哪个地方返回这个错误的?开始以为是request filtering module,调整了request limits设置不能解决问题,禁用request filtering module也解决不了问题。

后来在iis官方论坛的帖子http 400. the size of the request headers is too long中得知,这个错误是http.sys返回的,请求头长度限制是由注册表hkey_local_machine\system\currentcontrolset\services\http\parameters中的两个参数决定的:maxfieldlength与maxrequestbytes,缺省值都是16384字节,详见http.sys registry settings for iis

由于修改这两个设置需要重启iis(net stop http, net start http, iisreset),并且只是表面上解决问题,所以我们没有立即采取这个方法。又回过头来在chrome中查看请求头,突然发现cookie的值好长。

cnzz统计代码引起的Bad Request - Request Too Long的原因分析

进一步查看cookie:

cnzz统计代码引起的Bad Request - Request Too Long的原因分析

很多cnzz_eid,这是cnzz统计代码产生的,可是我们在博客中没有使用cnzz。但是,有的用户博客自己加了cnzz的统计代码。我们检查了一些会产生"bad request - request too long"的页面,的确有些加了cnzz的代码。

我们手动在chrome中删除了一些带有cnzz_eid的cookie,问题就解决了。

cnzz统计代码引起的Bad Request - Request Too Long的原因分析

原来是cnzz惹的祸!

为什么在ie与firefox中不会出现这个问题呢?

可能是ie与firefox对于request header过长的请求会自动截断;而chrome对此置之不理。

小结

这篇文章分享的内容是:当iis返回"bad request - request too long. http error 400. the size of the request headers is too long."的错误时,说明客户端发出的请求头长度超出了http.sys的限制,这个限制是由注册表"hkey_local_machine\system\currentcontrolset\services\http\parameters"中的两个参数maxfieldlength与maxrequestbytes决定的,默认值是16384字节。