[IIS]修改MaxFieldLength与MaxRequestBytes彻底解决Request Too Long的问题

当 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

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

小结

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

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

转载于:https://www.cnblogs.com/Jeremy2001/p/9694872.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 VB.NET 实现的 CLucene 示例代码: 首先,需要安装 CLucene 的 NuGet 包。在 Visual Studio 中,使用 `Tools` -> `NuGet Package Manager` -> `Manage NuGet Packages for Solution` 打开 NuGet 管理器,搜索 `CLucene` 并安装。 接下来,可以创建一个简单的控制台应用程序,使用以下代码实现搜索: ```vb Imports System Imports System.Text Imports Lucene.Net.Analysis.Standard Imports Lucene.Net.Documents Imports Lucene.Net.Index Imports Lucene.Net.QueryParsers Imports Lucene.Net.Search Imports Lucene.Net.Store Module Program Sub Main(args As String()) Using directory As Directory = FSDirectory.Open("index") Using analyzer As Analyzer = New StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30) Using writer As IndexWriter = New IndexWriter(directory, analyzer, True, IndexWriter.MaxFieldLength.UNLIMITED) ' 创建一个文档 Dim doc As Document = New Document() doc.Add(New Field("title", "Lucene in Action", Field.Store.YES, Field.Index.ANALYZED)) doc.Add(New Field("author", "Erik Hatcher", Field.Store.YES, Field.Index.ANALYZED)) doc.Add(New Field("publisher", "Manning Publications", Field.Store.YES, Field.Index.ANALYZED)) writer.AddDocument(doc) writer.Commit() ' 创建一个查询解析器 Dim parser As QueryParser = New QueryParser(Lucene.Net.Util.Version.LUCENE_30, "title", analyzer) Dim query As Query = parser.Parse("Lucene") ' 执行搜索 Using searcher As IndexSearcher = New IndexSearcher(directory) Dim hits As TopDocs = searcher.Search(query, 10) ' 输出搜索结果 Console.WriteLine("Total hits: " & hits.TotalHits) For Each scoreDoc As ScoreDoc In hits.ScoreDocs Dim docSearch As Document = searcher.Doc(scoreDoc.Doc) Console.WriteLine(docSearch.Get("title")) Next End Using End Using End Using End Using Console.ReadLine() End Sub End Module ``` 这个示例程序创建了一个名为 `index` 的索引目录,并向其添加了一个文档。然后,它使用 `QueryParser` 创建了一个查询,查询包含 `title` 字段中的 `Lucene` 关键字。最后,它使用 `IndexSearcher` 对象执行查询,输出匹配的文档标题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值