71

我有一个使用setRequestHeader API将上下文信息添加到XmlHttpRequest对象的 Web 应用程序。我正在使用自定义标头名称(例如 X-Foo)和JSON结构化值。它不是 URL QueryString 或 POST 正文的一部分,因为它是有关请求的元信息。

标头值是否有实际大小限制?如果我的 JSON 被截断,它将变得无法解析。我最关心的是 Apache 2、Tomcat 6 和 IIS 7 中的限制。我在 Google 上搜索了http header length limit,但很多结果似乎都过时了。用户代理字符串有多大可以得到一些相关的评论?但没有我想的那么具体。

编辑: 我刚刚遇到了这个类似的问题 - http 标头值的最大值?

4

5 回答 5

58

尽管每个 Web 服务器软件都有一些限制,但是对于HTTP 请求行加上标头字段或每个标头字段是否有限制是有区别的。

这是一个摘要:

  • Apache 1.3、2.0、2.2、2.38190字节每个头字段)_
  • IIS:
    • 4.0 : 2097152 字节(对于请求行加上标题字段)
    • 5.0 : 131072 Bytes , 16384 Bytes with Windows 2000 Service Pack 4 (对于请求行加上标题字段)
    • 6.016384 字节(每个头字段)
  • 雄猫:
    • 5.5.x / 6.0.x49152 字节(用于请求行加上标题字段)
    • 7.0.x8190 字节(用于请求行加上标题字段)

因此得出结论:要被上述所有 Web 服务器接受,请求的请求行加上标头字段不应超过 8190 字节。这也是每个标题字段的限制(实际上甚至更少)。

于 2011-05-28T08:59:45.907 回答
51

是的,但限制是可配置的并且取决于平台。例如,Tomcat的默认限制为 8K。我相信 IIS 6,不确定 IIS 7,有 16K 的限制。我在为多个网站使用集成 Windows 身份验证时遇到了这个问题。结果发现我的安全令牌在编码到标头时太大了。幸运的是,这些都是可配置的。可以在http://support.microsoft.com/kb/820129找到 IIS 的注册表设置。我相信要更改的关键设置是 MaxFieldLength(每个标头大小)和 MaxRequestBytes(请求的总大小)。

于 2009-07-08T12:21:48.803 回答
15

对于 Apache,我发现这篇Apache Security 的服务器限制文章列出了这些指令:

  # allow up to 100 headers in a request
  LimitRequestFields 100
  # each header may be up to 8190 bytes long
  LimitRequestFieldsize 8190

对于 Nginx,来自 HttpCoreModule 的large_client_header_buffers指令控制:

请求的最长标题行也必须不超过一个缓冲区的大小,否则客户端会收到错误“Bad request”(400)。

默认情况下,一个缓冲区的大小等于页面的大小,具体取决于平台是 4K 还是 8K

于 2009-07-09T23:42:58.713 回答
4

虽然您可以配置服务器,但您不太可能真正配置通过防火墙、负载平衡器和代理的整个方式。保持较小的标头大小可以避免问题。

于 2014-03-05T08:08:56.663 回答
3

Flash Media Server 4.5 有一个非常短的默认标头长度限制,这可能会导致服务器根本不响应,尤其是在 cookie 负载适中的情况下。

请参阅:Flash Media Server 4.5 配置和管理:配置服务器 配置 Apache HTTP 服务器:指定最大 HTTP 标头行长度

在 Flash Media Server Adaptor.xml 文件中,该MaxHeaderLineLength 元素确定服务器可以处理的 HTTP 标头的大小。的默认值为MaxHeaderLineLength1024 字节。一些浏览器会发送大于 1024 字节的标头。在这种情况下,Apache 会发回一个空响应。要解决此问题,请配置 MaxHeaderLineLength为 8192。

注意:默认情况下,Apache HTTP 标头大小限制为 8 KB(8190 字节加上回车)。

将其放在这里以防 Flash Media Server 上的标头大小限制影响其他人。

于 2012-10-05T01:23:21.427 回答