http标头值最大?
HTTP标头是否有可接受的最大尺寸? 如果是这样,那是什么? 如果没有,这是一个服务器特定的或可接受的标准,允许任何大小的标题?
不,HTTP没有定义任何限制。 但是,大多数Web服务器确实限制了他们接受的标题大小 例如在Apache中默认的限制是8KB,在IIS中是16K 。 如果标题大小超过此限制,服务器将返回413 Entity Too Large
错误。
相关问题: 用户代理string可以有多大?
正如vartec上面所说,HTTP规范并没有定义一个限制,但是很多服务器默认都是这样做的。 这意味着,实际上,下限是8K 。 对于大多数服务器来说,这个限制适用于请求行和所有标题字段的总和 (所以保持你的cookies的简短)。
- 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。
如2.5节所述,HTTP不会对每个头字段的长度或头部分的长度作出整体预定的限制。 在实践中发现各个头部字段长度的特定限制,通常取决于具体的字段语义。
HTTP标头值受服务器实现的限制。 Http规范不限制标题大小。
接收到一个大于它希望处理的请求标题字段或字段集合的服务器必须响应一个适当的4xx(客户端错误)状态码。 忽略这样的头字段会增加服务器的漏洞来请求走私攻击(第9.5节)。
发生这种情况时,大多数服务器将返回413 Entity Too Large
或4xx错误。
客户端可以丢弃或截断大于客户端希望处理的接收到的头部字段,如果字段语义是这样的,即在不改变消息成帧或响应语义的情况下可以安全地忽略丢弃的值。
不加限制的HTTP标头大小使服务器暴露在攻击之下,并且可以降低服务有机stream量的能力。
资源
我还发现,在某些情况下,在许多标题的情况下502/400的原因可能是因为大量的标题而不考虑大小。 从文档
tune.http.maxhdr设置请求中标题的最大数量。 当一个请求带有大于这个值的报头(包括第一行)时,它会被一个“400 Bad Request”状态码拒绝。 同样,过大的响应被“502错误的网关”阻止。 默认值是101,考虑到广泛部署的Apache服务器使用相同的限制,这对于所有用途都是足够的。 进一步推动这个限制以暂时允许一个错误的应用程序在修复之前工作是有用的。 请记住,每个新的头文件每个会话消耗32位内存,所以不要把这个限制过高。
https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr