题
它依赖于浏览器吗?另外,不同的 Web 堆栈对于从请求中获取的数据量是否有不同的限制?
解决方案
RFC 2616 (超文本传输协议 — HTTP/1.1)规定查询字符串的长度没有限制(第 3.2.1 节)。 RFC 3986 还声明没有限制,但表示由于 DNS 限制,主机名限制为 255 个字符(第 2.3.3 节)。
虽然规范没有指定任何最大长度,但网络浏览器和服务器软件施加了实际限制。根据以下发现的研究 Boutell.com:
微软 Internet Explorer(浏览器)
Microsoft 规定 Internet Explorer 中 URL 的最大长度为 2,083 个字符,其中 URL 的路径部分不超过 2,048 个字符。尝试使用比这长的 URL 会在 Internet Explorer 中产生明显的错误消息。微软 Edge(浏览器)
该限制似乎约为 81578 个字符。看 Microsoft Edge 的 URL 长度限制铬合金
它停止了 显示 URL 位于 64k 个字符之后,但可以提供超过 100k 个字符。除此之外没有进行进一步的测试。火狐(浏览器)
65,536 个字符后,Windows Firefox 1.5.x 中的地址栏不再显示 URL。不过,更长的 URL 也可以。100,000 个字符后不再进行进一步测试。Safari(浏览器)
至少可以使用 80,000 个字符。除此之外没有尝试过测试。歌剧(浏览器)
至少可以使用 190,000 个字符。190,000 个字符后停止测试。Windows的Opera 9继续在位置栏中显示完全可编辑,可复制和可粘的URL,即使有190,000个字符。阿帕奇(服务器)
早期尝试测量 Web 浏览器中的最大 URL 长度时遇到了大约 4,000 个字符的服务器 URL 长度限制,之后 Apache 生成了“413 Entity Too Large”错误。使用了 Red Hat Enterprise Linux 4 中最新的 Apache 版本。Apache 官方文档仅提到请求中单个字段的 8,192 字节限制。微软互联网信息服务器(服务器)
默认限制为 16,384 个字符(是的,Microsoft 的 Web 服务器接受比 Microsoft 的 Web 浏览器更长的 URL)。这是可配置的。Perl HTTP::守护进程(服务器)
最多可以使用 8,000 字节。使用 Perl 的 HTTP::Daemon 模块构建 Web 应用程序服务器时,所有 HTTP 请求标头的总大小将受到 16,384 字节的限制。这不包括 POST 方法表单数据、文件上传等,但它确实包括 URL。实际上,当 URL 明显长于 8,000 个字符时,这会导致 413 错误。这个限制可以很容易地消除。在 Daemon.pm 中查找所有出现的 16x1024 并将其替换为更大的值。当然,这确实会增加您遭受拒绝服务攻击的风险。
其他提示
虽然官方没有限制,但许多安全配置建议声明服务器上的maxQueryStrings应设置为1024的最大字符数限制,而包含查询字符串的整个URL应设置为最多2048个字符。这是为了防止Web服务器上的慢速HTTP请求漏洞,以防止出现在Qualys Web应用程序扫描程序和其他安全扫描程序上的慢速DDOS攻击。
请参阅以下带有Web.config的Windows IIS服务器代码:
<security>
<requestFiltering>
<requestLimits maxQueryString="1024" maxUrl="2048">
<headerLimits>
<add header="Content-type" sizeLimit="100" />
</headerLimits>
</requestLimits>
</requestFiltering>
</security>
不同的Web堆栈确实支持不同长度的http请求。我从经验中知道早期的Safari堆栈只支持4000个字符,因此因用户状态而难以处理ASP.net页面。这甚至适用于POST,因此您必须检查浏览器并查看堆栈限制。我认为即使在较新的浏览器上你也可能达到极限。我记不清了,但其中一个(IE6,我认为)有16位限制,32,768或其他限制。