当 IIS7/7.5 收到的请求头的长度超过16K(默认值),就会引发"Bad Request - Request Too Long. HTTP Error 400. The size of the request headers is too long."的错误。

博客园服务器曾遭遇过这个问题,我为此写过一篇博文(cnzz统计代码引起的Bad Request - Request Too Long),问题的原因是第三方统计服务cnzz的统计代码写入大量的cookie,请求时会携带着这些cookie,从而造成请求头长度超过限制。

本来以为这个问题只在Chrome中出现,后来有园友反馈Firefox也会出现这个问题。所以,要解决这个问题,必须从服务器端下手,这篇文章分享的就是如何从服务器端下手。

何处下手

根据IIS官方论坛的帖子(HTTP 400. The size of the request headers is too long),16K的请求头/请求长度限制由是注册表(HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters)中的两个参数 MaxFieldLength(请求头) 与 MaxRequestBytes(请求头与请求体) 决定的。所以,要从这两个参数下手。

了解下手的对象

通过微软官方文档(http://support.microsoft.com/kb/820129)进一步了解MaxRequestBytes与MaxFieldLength:

MaxFieldLength - Sets an upper limit for each header.

用于设置每一个请求头的字节数上限(默认16K)。

MaxRequestBytes - Determines the upper limit for the total size of the Request line and the headers.

用于设置请求行(请求体)与请求头的总字节数上限(默认16K)。

如何下手

下手也就是调整 MaxFieldLength 与 MaxRequestBytes 的值(这里假设将这两个值修改为32K),并使其生效。

运行regedit,进入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters ,

1. 添加类型为 DWORD(32-bit)、名为 MaxFieldLength、值为十进制32768的项目;

2. 添加类型为 DWORD(32-bit)、名为 MaxRequestBytes、值为十进制32768的项目。

添加好了,如何让它们生效呢?最简单的方法就是重启,可是对于服务器,最不想做的就是重启。

还好,微软官方文档中提到了不重启的解决方法,需要运行四个命令:

net stop http
net start http
net stop iisadmin /y 
net start servicename

但是第3个命令 net stop iisadmin 会停用IIS相关的所有服务,第4个命令要将IIS相关的所有服务一个一个启动。

虽然不需要重启服务器,但是这四个命令的解决方案我不喜欢。。。在网上也没找到更好的解决方法。。。

后来,通过摸索,找到了一个更简单的方法,只需三个命令:

net stop http
net start http
iisreset

这个方法已经在服务器上通过实际验证。

小结

搞技术的乐趣之一就是在遇到问题时能够找到自己心目中想要的解决方法,心目中想要的解决方法不是它已在你心中,而是当它出来时,你心中会知道 —— 就是它!

生活中也是一样,你心目中的那个人,你无法准确地描述出来,当她/他出现时,你心中会知道 —— 就是她/他。

[IIS]修改MaxFieldLength与MaxRequestBytes彻底解决Request Too Long的问题的更多相关文章

  1. Request Entity Too Large for Self Hosted ASP.Net Web API在Selfhost的api后台怎么解决Request Entity Too Large问题

    Request Entity Too Large for Self Hosted ASP.Net Web API在Selfhost的api后台怎么解决Request Entity Too Large问 ...

  2. IIS中访问自己开发的Webservice site就自动停止,尝试重启IIS和重启服务器都不能解决。

    今天在加班的时候发现一个奇怪的问题,IIS里面我们自己开发的Webservice site一访问就自动停止.尝试重启IIS和重启服务器都不能解决.后台windows events报错信息是The Mo ...

  3. 修改 docker image 安装目录 (解决加载大image时报错:"no space left on device")

    修改 docker image 安装目录 (解决加载大image时报错:"no space left on device" ) 基于Ubuntu16.04 docker版本: 17 ...

  4. jmeter解决request response中文乱码问题

    一:主要内容 解决request请求入参中文乱码问题 解决response响应数据中文乱码问题 二:解决request和response中文乱码问题 request结果:-中文已经不乱码了 respo ...

  5. 关于MVC中 服务器无法在发送 HTTP 标头之后修改 cookie此类问题的解决

    处理方法 使用过滤器控制权限时,若无权则跳转到无权页面,但是每次跳转都会出现 ERROR - System.Web.HttpException (0x80004005): 服务器无法在已发送 HTTP ...

  6. Windows性能查看器:系统的性能信息(I/O,IIS最大连接数,Sql) ,以及解决 asp.net IIS 一二百多用户并发

    在测试过程中,我们经常需要知道“系统的资源利用情况”来监测我们的测试执行情况,来查看测试环境是否有效,测试结果是否可信,或者是在无人值守时保存结果,等我们值班时再来分析. 1.在Windows环境下, ...

  7. (转)配置Website的IIS时遇到的问题与解决方法

    在部署WebSite时遇到问题,刚好发现Eric Sun的文章,因此转载做个副本. 原文地址:http://www.cnblogs.com/mingmingruyuedlut/archive/2011 ...

  8. XP中IIS“HTTP 500 - 内部服务器错误”解决方法

    我先把主要过程叙述一下,叙述完有每个问题的具体操作方法. 今天我在XP上安装IIS,运行网站出现"HTTP 500 - 内部服务器错误". 打开HTML没有问题,打开ASP文件时就 ...

  9. IIS 无法识别的属性“targetFramework”---解决之道

    在安装VS2010后,应用.NET Framework 4创建的网站放在IIS(7.0)下会出现如下的错误: 其中的“版本信息”中告诉了我们.NET Framework和ASP.NET的版本都是2.0 ...

随机推荐

  1. Springboot(八):emoji表情保存到mysql出错的解决办法

    emoji表情保存到mysql出错的解决办法 今天,在前端的说明信息中输入emoji表情的时候,插入数据库会报错 百度了一下,是因为mysql数据库的字符编码集不正确,utf8无法存入表情字符,只能将 ...

  2. css命名和书写规范

    前言 在项目开发中对于css名字的命名和书写老是感觉很混乱,这对于代码的可读性以及维护提出了挑战,所以在闲暇之余看了一些这方面的内容,现总结如下... 1.命名规则说明 所有的命名最好都小写 属性的值 ...

  3. group by 与 order by 一起使用的时候

    select 后面的列+order by 后面的列 必须在group by 里面 也就是说 select 和 order by 后面的列是 group by 列的子集 而 select 和 order ...

  4. legend3---Laravel Homestead的安装和使用

    legend3---Laravel Homestead的安装和使用 一.总结 一句话总结: 配置好homestead之后编码非常方便:在虚拟机或者外部机器里面操作代码两者都会同时改变. 1.Homes ...

  5. JavaScript json loop item in array

    Iterating through/Parsing JSON Object via JavaScript 解答1 Your JSON object is incorrect because it ha ...

  6. kafka-manager怎么查看topic里的数据量

    https://jingyan.baidu.com/article/eb9f7b6d367679869364e8d4.html

  7. leetcode-mid-math-172. Factorial Trailing Zeroes-NO-????

    mycode 问题:为甚在小于200的时候,答案ok,大于等于200的时候,就少一个1??? class Solution(object): def trailingZeroes(self, n): ...

  8. python 整数转字节 char

    把10进制整数30,转换为字节 方法一 chr(30).encode() 结果 方法二 struct.pack('B', 30) 结果 准确地讲,Python没有专门处理字节的数据类型.但由于str既 ...

  9. ES6中let和var的区别

    通过var定义的变量,作用域是整个封闭函数,是全域的 .通过let定义的变量,作用域是在块级或是子块中. 变量提升现象:浏览器在运行代码之前会进行预解析 -不论var声明的变量处于当前作用域的第几行, ...

  10. 分布式消息队列 Celery 的最佳实践

    目录 目录 不使用数据库作为 Broker 不要过分关注任务结果 实现优先级任务 应用 Worker 并发池的动态扩展 应用任务预取数 保持任务的幂等性 应用任务超时限制 善用任务工作流 合理应用 a ...