是否有一个可接受的HTTP头的最大允许大小?如果有,是什么?如果不是,这是特定于服务器的东西,还是允许任何大小的头的公认标准?
不,HTTP没有定义任何限制。然而,大多数web服务器确实限制了它们接受的头文件的大小。例如,在Apache默认限制中是8KB,在IIS,它是16K中。如果报头大小超过该限制,服务器将返回413 Entity Too Large错误。
413 Entity Too Large
相关问题:用户代理字符串可以有多大?
正如vartec上面所说,HTTP规范没有定义限制,但是许多服务器默认情况下是这样做的。这意味着,实际上,下限是8 k。对于大多数服务器,这个限制适用于请求行和ALL报头字段的总和(所以保持你的cookie简短)。
值得注意的是,nginx默认使用系统页面大小,在大多数系统上是4K。你可以用这个小程序来检查:
#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。我的ubuntu服务器Linode尽职地告诉我答案是4k。
gcc -o pagesize pagesize.c
./pagesize
HTTP不对每个报头的长度进行预定义限制 字段或标题节的长度作为一个整体,如所述 第2.5节。对单个头文件的各种特殊限制 场长是在实践中发现的,往往视具体情况而定 领域语义。< / p >
HTTP头值受服务器实现的限制。Http规范不限制头的大小。
接收请求报头字段或一组字段的服务器, 大于它希望的进程必须响应一个适当的4xx (客户端错误)状态码。忽略这样的报头字段 增加服务器对请求走私攻击的脆弱性 (9.5节)。< / p >
当这种情况发生时,大多数服务器将返回413 Entity Too Large或适当的4xx错误。
客户端可以丢弃或截断接收到的报头字段 如果字段语义大于客户端希望处理的值 这样就可以在不更改的情况下安全地忽略掉所删除的值 消息框架或响应语义
不封顶的HTTP报头大小会使服务器暴露在攻击之下,并降低其服务有机流量的能力。
Source .
< p > tune.http.maxhdr 设置请求中报头的最大数量。当请求带有 大于此值(包括第一行)的报头数目 以“400坏请求”状态码拒绝。同样,反应太大 被“502坏网关”阻止。缺省值是101,这就足够了 对于所有用法,考虑到广泛部署的Apache服务器使用 同样的限制。将此限制进一步推到临时允许的范围内是有用的 一个有bug的应用程序在被修复之前可以正常工作。记住每一个 新报头为每个会话消耗32位内存,所以不要推送这个
< a href = " https://cbonte.github.io/haproxy-dconv/configuration-1.5.html 3.2 -tune.http。Maxhdr " rel="nofollow noreferrer">https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr
这是最流行的网络服务器的限制
如果您打算使用任何像Akamai这样的DDOS提供商,他们的响应头大小最大限制为8k。所以尽量将响应头大小限制在8k以下。
2011年的RFC 6265规定了cookie的具体限制。
https://www.rfc-editor.org/rfc/rfc6265 6.1. 限制< / p >
实际的用户代理实现在数量和 它们可以存储的cookie大小。一般使用的用户代理应该
o每个cookie至少4096字节 cookie的名称、值和属性的长度)
o每个域至少50个cookie。
o总共至少3000个饼干。
如果用户代理返回失败,服务器应该正常降级 Cookie头中的一个或多个Cookie,因为用户代理可能会
--
RFC的预期受众是用户代理或服务器必须支持的内容。似乎要调优您的服务器以支持浏览器所允许的功能,您需要配置4096*50作为限制。正如下面的文本所示,这似乎远远超出了典型web应用程序所需要的。使用当前限制和RFC概述的上限,并比较较高配置的内存和IO结果是很有用的。