HTTP GET 请求的最大长度

Posted

技术标签:

【中文标题】HTTP GET 请求的最大长度【英文标题】:Maximum length of HTTP GET request 【发布时间】:2011-02-09 05:42:43 【问题描述】:

是多少?

如果服务器接收到超过此长度的 GET 请求,是否定义了响应错误可以/应该返回?

这是在 Web 服务 API 的上下文中,尽管浏览器限制也很有趣。

【问题讨论】:

What is the maximum length of a URL?的可能重复 @KillianDS 它与 URL 的最大长度完全无关。问题是关于发送一个URL的请求的最大长度。 @EJP GET 的“数据”内容不超过 URI。 @JimAho 你的评论也是第一条评论的重复..... 【参考方案1】:

限制取决于使用的服务器和客户端(如果适用,还取决于服务器或客户端使用的代理)。

大多数网络服务器都有 8192 字节 (8 KB) 的限制,通常可以在服务器配置中的某个位置进行配置。至于客户端问题,HTTP 1.1 规范甚至对此提出警告。这是chapter 3.2.1的摘录:

注意:服务器应该谨慎对待超过 255 字节的 URI 长度,因为一些较旧的客户端或代理实现可能无法正确支持这些长度。

Internet Explorer 和 Safari 中的限制约为 2 KB,Opera 中约为 4 KB,Firefox 中约为 8 KB。因此,我们可以假设 8 KB 是可能的最大长度,而 2 KB 是在服务器端依赖的更实惠的长度,而 255 字节是假设整个 URL 都会进入的最安全长度。

如果在浏览器或服务器中超出限制,大多数将截断超出限制的字符而不会发出任何警告。 一些服务器可能会发送HTTP 414 error。

如果您需要发送大数据,那么最好使用 POST 而不是 GET。它的限制要高得多,但更多地依赖于所使用的服务器而不是客户端。普通网络服务器通常最多允许大约 2 GB。

这也可以在服务器设置中的某处进行配置。当超过 POST 限制时,一般服务器会显示特定于服务器的错误/异常,通常是 HTTP 500 错误。

【讨论】:

您根据浏览器限制回答问题。如果 HttpClient 用于与 REST 服务器交互,您是否知道 GET 和 POST 之间是否存在任何差异(就有问题的请求大小而言)? 当然,POST 使用正文发送数据。 HTTP 规范没有对帖子施加特定的大小限制。 Http 规范完全允许在 GET 和 DELETE 请求中放置正文。我已经在 J​​ava 中对其进行了测试,并且可以正常工作。不幸的是,这里再次有些代理可能会切割整个身体。 Get 和 Post 方法有一个非常具体的含义,所以使用 POST 执行 GET 与使用锤子打鸡蛋是一样的。 @nohros 这在理想上是正确的,但 GET 也有 POST/PUT 没有的限制。例如,假设您要执行涉及一堆 id 的非常长的查询;如果您在数百个 id 上进行选择,这可能会违反允许的 URL 大小的限制,而将该查询放在 POST 中可以避免这种情况,即使它在概念上没有多大意义。就个人而言,我希望 HTTP 允许 GET 请求具有像 PUT 和 POST 一样的主体。【参考方案2】:

你在这里问了两个不同的问题:

HTTP GET 请求的最大长度是多少?

如前所述,HTTP 本身不会对请求长度施加任何硬编码限制;但浏览器的限制范围为 2 KB - 8 KB(如果我们算上 非常旧的浏览器,则为 255 字节)。

如果服务器接收到超过此长度的 GET 请求,是否定义了响应错误可以/应该返回?

这是没有人回答的。

HTTP 1.1 为达到服务器定义的限制的情况定义了状态代码414 Request-URI Too Long。您可以在RFC 2616 上查看更多详细信息。

对于客户端定义的限制,服务器返回内容没有任何意义,因为服务器根本不会收到请求。

【讨论】:

【参考方案3】:

浏览器限制为:

Browser           Address bar    document.location
                                 or anchor tag
---------------------------------------------------
Chrome                32779           >64k
android                8192           >64k
Firefox                >64k           >64k
Safari                 >64k           >64k
Internet Explorer 11   2047           5120
Edge 16                2047          10240

想要更多?见this question on Stack Overflow。

【讨论】:

【参考方案4】:

这里有一个类似的问题:Is there a limit to the length of a GET request?

我的共享主机帐户已达到限制,但浏览器在到达我认为的服务器之前返回了一个空白页面。

【讨论】:

【参考方案5】:

从技术上讲,我发现如果 URL 长度超过 2000 个字符,HTTP GET 就会出现问题。在这种情况下,最好使用 HTTP POST 或拆分 URL。

【讨论】:

【参考方案6】:

如前所述,HTTP 本身不会对请求长度施加任何硬编码限制;但是浏览器对 GET 方法中允许的 2048 个字符有限制。

【讨论】:

【参考方案7】:

是的。 GET 请求没有任何限制。

我可以使用 Chrome 浏览器和 curl 命令发送约 4000 个字符作为查询字符串的一部分。

我正在使用已返回预期 200 OK 响应的 Tomcat 8.x 服务器。

这是一个谷歌浏览器 HTTP 请求的屏幕截图(出于安全原因,我隐藏了我尝试的端点):

回应

【讨论】:

以上是关于HTTP GET 请求的最大长度的主要内容,如果未能解决你的问题,请参考以下文章

GET请求的长度限制?

GET/POST 请求参数长度的最大值

Get请求有大小限制?别再执迷不悟了!

【HTTP】GET传参最大长度的理解误区

关于 HTTP GET/POST 请求参数长度最大值的一个理解误区(转载)

HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。