2009-07-08 207 views
66

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

标题值是否有实际的大小限制?如果我的JSON被截断,它将变得不可分析。我最关心的是Apache 2,Tomcat 6和IIS 7的限制。我做了Google搜索http标头长度限制,但许多结果似乎过时了。 How big can a user agent string get?中有一些相关的评论,但并不像我想的那样具体。

编辑: 我只是碰到这种类似的问题跑 - Maximum on http header values?

+0

有趣的方法。你以什么样的元数据发送? – 2009-07-08 12:30:07

+0

另请注意,如果用户通过代理服务器连接,则可能会导致问题 – carpii 2012-08-13 23:08:34

回答

45

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

14

对于Apache,我发现这个Server Limits for 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指令是:

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

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

52

虽然每个web服务器软件有一定的局限性,是有区别是否有一个限制HTTP request line加头字段或每个头字段。

这里的一个摘要:

  • 阿帕奇1.32.02.22.38190字节(对于每个报头字段)
  • IIS:
    • 4.02097152字节(对于请求行加头字段)
    • 5.0131072字节16384字节与Windows 2000服务包4(用于请求行加上报头字段)
    • 6.016384字节(对于每个报头字段)
  • Tomcat的:
    • 5.5.x/6.0.x49152字节(用于请求线加上报头字段)
    • 7.0.x8190字节(请求行加报头字段)

因此得出结论:通过以上的所有Web服务器所接受,一个请求的请求行加头字段不应该超过8190字节。这也是每个头域的限制(有效甚至更少)。

3

Flash Media Server 4.5具有非常短的默认标头长度限制,可能导致服务器无法响应,特别是在存在适度的Cookie负载的情况下。

参见:Flash Media Server 4.5 Configuration and Administration: Configuring the server Configuring Apache HTTP Server: Specify the maximum HTTP header line length

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

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

把这个放在这里以防止Flash Media Server上的头大小限制咬别人。

4

虽然您可以配置服务器,但您不太可能真的可以通过防火墙,负载平衡器和代理进行全部配置。保持头部大小很小,不会有问题。