Answers:
不,HTTP没有定义任何限制。但是,大多数Web服务器确实会限制它们接受的标头的大小。例如,在Apache中,默认限制为8KB,在IIS中,默认限制为16K。413 Entity Too Large
如果标头大小超过该限制,服务器将返回错误。
相关问题:用户代理字符串可以达到多大?
就像vartec上面说的那样,HTTP规范没有定义限制,但是默认情况下许多服务器都做过限制。实际上,这意味着下限是8K。对于大多数服务器,此限制适用于请求行和所有标头字段的总和(因此,请使Cookie简短)。
值得注意的是,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。
LimitRequestLine
并LimitRequestFieldSize
适用于每个HTTP标头行...不是“ ...之和”
HTTP并未对每个标头字段的长度或整个标头部分的长度设置预定义的限制,如2.5节所述。在实践中,通常会根据特定的字段语义找到对各个标头字段长度的各种特殊限制。
HTTP标头值受服务器实现的限制。Http规范不限制标头大小。
接收到大于其希望处理的请求标头字段或一组字段的服务器,必须以适当的4xx(客户端错误)状态码进行响应。忽略此类标头字段会增加服务器请求走私攻击的漏洞(第9.5节)。
413 Entity Too Large
发生这种情况时,大多数服务器将返回或出现相应的4xx错误。
如果字段语义使得在不改变消息帧或响应语义的情况下可以安全地忽略丢弃的值,则客户端可以丢弃或截断大于客户端希望处理的报头字段。
HTTP标头的大小不受限制,使服务器容易受到攻击,并可能降低其服务有机流量的能力。
我还发现,在某些情况下,出现许多标头的情况下使用502/400的原因可能是由于大量标头而不考虑大小。从文档
tune.http.maxhdr设置请求中最大标头数。当请求的标头数大于此值(包括第一行)时,将被状态代码“ 400 Bad Request”拒绝。同样,太大的响应将被“ 502 Bad Gateway”阻止。考虑到广泛部署的Apache服务器使用相同的限制,默认值为101,足以满足所有用途。进一步推动此限制可能很有用,以便在有问题的应用程序修复后暂时允许其运行。请记住,每个新标头在每个会话中都会占用32位内存,因此请不要将此限制过高。
https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr