是否有一个可接受的HTTP头的最大允许大小?如果有,是什么?如果不是,这是特定于服务器的东西,还是允许任何大小的头的公认标准?


当前回答

我还发现在某些情况下,在许多头文件的情况下出现502/400的原因可能是因为有大量的头文件而不考虑大小。 来自文档

tune.http.maxhdr Sets the maximum number of headers in a request. When a request comes with a number of headers greater than this value (including the first line), it is rejected with a "400 Bad Request" status code. Similarly, too large responses are blocked with "502 Bad Gateway". The default value is 101, which is enough for all usages, considering that the widely deployed Apache server uses the same limit. It can be useful to push this limit further to temporarily allow a buggy application to work by the time it gets fixed. Keep in mind that each new header consumes 32bits of memory for each session, so don't push this limit too high.

https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr

其他回答

HTTP对每个报头的长度没有预先定义的限制 字段或标题节的长度作为一个整体,如所述 第2.5节。对单个头文件的各种特殊限制 场长是在实践中发现的,往往视具体情况而定 领域的语义。

HTTP头值受服务器实现的限制。Http规范不限制头的大小。

接收请求头字段或一组字段的服务器, 大于它希望的进程必须响应一个适当的4xx (客户端错误)状态码。忽略这样的报头字段 增加服务器对请求走私攻击的脆弱性 (9.5节)。

当这种情况发生时,大多数服务器将返回413实体过大或适当的4xx错误。

客户端可以丢弃或截断接收到的报头字段 如果字段语义大于客户端希望处理的值 这样就可以在不更改的情况下安全地忽略掉所删除的值 消息框架或响应语义。

不封顶的HTTP报头大小会使服务器暴露在攻击之下,并降低其服务有机流量的能力。

我还发现在某些情况下,在许多头文件的情况下出现502/400的原因可能是因为有大量的头文件而不考虑大小。 来自文档

tune.http.maxhdr Sets the maximum number of headers in a request. When a request comes with a number of headers greater than this value (including the first line), it is rejected with a "400 Bad Request" status code. Similarly, too large responses are blocked with "502 Bad Gateway". The default value is 101, which is enough for all usages, considering that the widely deployed Apache server uses the same limit. It can be useful to push this limit further to temporarily allow a buggy application to work by the time it gets fixed. Keep in mind that each new header consumes 32bits of memory for each session, so don't push this limit too high.

https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr

如果您打算使用任何像Akamai这样的DDOS提供商,他们的响应头大小最大限制为8k。所以尽量将响应头大小限制在8k以下。

正如vartec上面所说,HTTP规范没有定义限制,但是许多服务器默认情况下是这样做的。这意味着,实际上,下限是8K。对于大多数服务器,这个限制适用于请求行和ALL报头字段的总和(所以保持您的cookie简短)。

Apache 2.0, 2.2: 8K nginx: 4K - 8K IIS:不同版本不同,8K - 16K Tomcat:根据版本不同,8K - 48K (?!)

值得注意的是,nginx默认使用系统页面大小,在大多数系统上是4K。你可以用这个小程序来检查:

pagesize.c:

#include <unistd.h>
#include <stdio.h>

int main() {
    int pageSize = getpagesize();
    printf("Page size on your system = %i bytes\n", pageSize);
    return 0;
}

使用gcc -o pagesize pagesize.c编译,然后运行。/pagesize。我在Linode的ubuntu服务器尽职尽责地告诉我答案是4k。

不,HTTP没有定义任何限制。然而,大多数web服务器确实限制了它们接受的头文件的大小。例如,在Apache的默认限制是8KB,在IIS是16K。如果报头大小超过限制,服务器将返回413实体过大错误。

相关问题:用户代理字符串可以有多大?