是否有实用的HTTP标头长度限制?

Kev*_*son 70 iis-7 http apache2 tomcat6 http-headers

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

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

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

Gum*_*mbo 57

尽管每个Web服务器软件都有一些限制,但是HTTP请求行加上标题字段或每个标题字段是否存在限制.

这是一个总结:

  • 的Apache 1.3,2.0,2.2,2.3:8190字节(对于每个报头字段)
  • IIS:
    • 4.0:2097152字节(对于请求行加上标题字段)
    • 5.0:131072字节,带有Windows 2000 Service Pack 4的16384字节(对于请求行和标题字段)
    • 6.0:16384字节(对于每个标题字段)
  • Tomcat的:
    • 5.5.x/6.0.x : 49152字节(对于请求行和标题字段)
    • 7.0.x:8190字节(对于请求行和标题字段)

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


tva*_*son 50

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

  • 虽然您可以配置服务器,但您不太可能真正配置防火墙,负载平衡器和代理的整个过程.保持标题大小不会使问题消失. (2认同)

Kev*_*son 14

对于Apache,我发现这个Apache安全服务器限制文章列出了这些指令:

  # allow up to 100 headers in a request
  LimitRequestFields 100
  # each header may be up to 8190 bytes long
  LimitRequestFieldsize 8190
Run Code Online (Sandbox Code Playgroud)

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

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

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