它依赖于浏览器吗?另外,不同的 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或其他限制。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top