是否允许HTTP标头允许的最大允许大小?如果是这样,它是什么?如果没有,这是特定于服务器的东西,还是允许任何大小的 Headers 的公认标准?
不,HTTP没有定义任何限制 . 但是,大多数Web服务器都会限制它们接受的标头大小 . 例如,Apache default limit是8KB,在IIS it's 16K中 . 如果标头大小超过该限制,服务器将返回 413 Entity Too Large 错误 .
413 Entity Too Large
相关问题:How big can a user agent string get?
正如vartec所述,HTTP规范没有定义限制,但默认情况下会有许多服务器 . 实际上,这意味着下限为 8K . 对于大多数服务器,此限制适用于 sum of the request line and ALL header fields (因此请保持您的Cookie简短) .
Apache 2.0,2.2: 8K
nginx: 4K - 8K
IIS:varies by version, 8K - 16K
Tomcat:varies by version, 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 .
gcc -o pagesize pagesize.c
./pagesize
HTTP不会对每个 Headers 字段的长度或 Headers 部分的长度设置预定义的限制,如第2.5节所述 . 在实践中发现了对各个报头字段长度的各种临时限制,通常取决于特定的字段语义 .
HTTP标头值受服务器实现的限制 . Http规范不限制标头大小 .
接收请求头字段或字段集的服务器大于其希望处理的字段必须以适当的4xx(客户端错误)状态代码进行响应 . 忽略此类标头字段会增加服务器对请求走私攻击的漏洞(第9.5节) .
发生这种情况时,大多数服务器将返回 413 Entity Too Large 或适当的4xx错误 .
如果字段语义使得可以安全地忽略删除的值而不改变消息成帧或响应语义,则客户端可以丢弃或截断大于客户端希望处理的接收头字段 .
无限制的HTTP标头大小使服务器免受攻击,并且可以降低其服务有机流量的能力 .
Source
我还发现在某些情况下,在许多 Headers 的情况下502/400的原因可能是因为大量的 Headers 而不考虑大小 . 来自文档
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
4 回答
不,HTTP没有定义任何限制 . 但是,大多数Web服务器都会限制它们接受的标头大小 . 例如,Apache default limit是8KB,在IIS it's 16K中 . 如果标头大小超过该限制,服务器将返回
413 Entity Too Large
错误 .相关问题:How big can a user agent string get?
正如vartec所述,HTTP规范没有定义限制,但默认情况下会有许多服务器 . 实际上,这意味着下限为 8K . 对于大多数服务器,此限制适用于 sum of the request line and ALL header fields (因此请保持您的Cookie简短) .
Apache 2.0,2.2: 8K
nginx: 4K - 8K
IIS:varies by version, 8K - 16K
Tomcat:varies by version, 8K - 48K(?!)
值得注意的是,nginx默认使用系统页面大小,在大多数系统上都是4K . 您可以查看这个小程序:
pagesize.c:
用
gcc -o pagesize pagesize.c
编译然后运行./pagesize
. 来自Linode的我的ubuntu服务器尽职尽责告诉我答案是4k .HTTP标头值受服务器实现的限制 . Http规范不限制标头大小 .
发生这种情况时,大多数服务器将返回
413 Entity Too Large
或适当的4xx错误 .无限制的HTTP标头大小使服务器免受攻击,并且可以降低其服务有机流量的能力 .
Source
我还发现在某些情况下,在许多 Headers 的情况下502/400的原因可能是因为大量的 Headers 而不考虑大小 . 来自文档
https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr