HTTP POST请求的大小限制是多少?

294
抱歉,如果这是重复的话题,我会认为是的,但是找不到相关信息。
我有一个Flex应用程序,通过Internet Explorer将数据发送回PHP/MySQL服务器。到目前为止,我还没有遇到任何问题,但提前了解这个问题可能会节省我很多的时间和工作。通过HTTP发布数据是否有大小限制? 我在网上找到的信息来回矛盾。所以,请限制回答在个人测试/验证的数字范围内。
我想要发布一个可能非常大的XML字符串(比如5MB)。
如果有任何区别的话:浏览器将始终是Internet Explorer(我们的产品需要它),POST来自Flex中的HTTPService,Web服务器是PHP,数据库是MySQL。

7
PHP中$_POST全局变量的长度是指其所有键值对中值的总和,可以使用strlen()函数获取其长度。 - karim79
1
我在Laravel中遇到了这个问题,然后在我的项目根目录下的server.php文件中添加了ini_set('max_input_vars', 2500);,问题得到了解决。https://dev59.com/Ro_ea4cB1Zd3GeqPNmMX#63241730 - saber tabatabaee yazdi
9个回答

220

这取决于服务器配置。如果您使用Linux或类似系统的PHP,则可以使用.htaccess配置文件来控制它,例如:

#set max post size
php_value post_max_size 20M

是的,我可以亲自证明这个方法是可行的 :)

如果你正在使用IIS,我不知道如何设置这个特定的值。


3
这个 post_max_size 设置在哪里?我是 PHP 新手,在我们的代码库中无法找到它(使用 DreamWeaver 的查找全部过程)。我想问我们的系统管理员,但他们很刻薄。:-P - invertedSpear
13
你可以将这个值设置为任何大小吗?有没有任何协议限制?你可以将它设置为999999999999999999999M吗? - Para
9
这篇帖子说你可以将其设置为机器内存的最大值。它还说默认值为2MB。 - RustyTheBoyRobot
39
既然这是PHP语言,我有点期望它接受任何值,并且当达到计算机极限时只会发生“段错误(SEGFAULT)”。 - RustyTheBoyRobot
14
在PNP.INI文件中有一个设置:max_input_vars在我的PHP版本(5.4.16)中,默认值为1000。根据手册: “可以接受多少输入变量(限制单独应用于$ _GET,$ _POST和$ _COOKIE超全局变量)”参考资料:http://www.php.net/manual/en/info.configuration.php#ini.max-input-vars - Nikolay Ivanov
显示剩余8条评论

80

请求的URL部分(GET和POST)可以被浏览器和服务器限制 - 通常安全大小为2KB,因为几乎没有浏览器或服务器使用更小的限制。

请求的主体(POST)通常基于字节大小由服务器限制,以防止一种DoS攻击(请注意,这意味着字符转义可能会增加主体的字节大小)。最常见的服务器设置是10MB,尽管所有流行的服务器都允许通过设置文件或面板来增加或减少此值。


一些例外情况存在于旧的手机或其他小型设备浏览器中 - 在这些情况下,更多是设备为此目的保留的堆空间的功能,而不是其他任何因素。

2
谈谈浏览器限制,考虑到 curl - Yugal Jindle
14
我知道我有点落后了,但像这样的回答是我喜欢 StackOverflow 的原因。超出了所需的范围,提供了一些有价值的背景信息。 - Dormouse

62

请注意,默认情况下此值被注释掉了,因此请取消注释并更改所需的值。 - Alvaro Flaño Larrondo

19
你可以通过设置php.ini变量max_input_vars来发布大量数据。 这个变量的默认大小是1000,但如果你想发送大量的数据,你必须相应地增加它的大小。 如果你不能通过ini_set设置大小,你必须通过htaccess或直接修改php.ini文件来实现。
max_input_vars  2500
memory_limit    256M

4
正如David所指出的那样,在大多数情况下,我会选择KB。
php_value post_max_size 2K

注意:我的表单很简单,只有几个文本框,没有长文本。
(PHP中KB的速记为K,如这里所述。)

3

默认情况下,POST请求的最大大小为8MB。但是您可以根据需要进行修改。 这个修改可以通过打开php.ini文件(php配置设置)来完成。

查找

post_max_size=8M  //for me, that was on line:771

根据您的需求替换数字8。


2

针对这个问题,最好的解决方案是不使用多个或超过1000个输入字段。您可以通过任何特殊字符(例如@)连接多个输入字段。

看下面的例子:

<input type='text' name='hs1' id='hs1'>
<input type='text' name='hs2' id='hs2'>
<input type='text' name='hs3' id='hs3'>
<input type='text' name='hs4' id='hs4'>
<input type='text' name='hs5' id='hs5'>

<input type='hidden' name='hd' id='hd'>

使用任何脚本(JavaScript或JScript),
document.getElementById("hd").value = document.getElementById("hs1").value+"@"+document.getElementById("hs2").value+"@"+document.getElementById("hs3").value+"@"+document.getElementById("hs4").value+"@"+document.getElementById("hs5").value

通过这种方法,您可以绕过max_input_vars问题。如果在php.ini文件中增加max_input_vars,这对服务器有害,因为它会使用更多的服务器缓存内存,有时会导致服务器崩溃。


1
我不明白变量拼接如何节省内存。 每个ASCII字符使用1个字节的内存。字符串(如果我没有错的话,技术上是char数组)使用n * 1个字节,其中n是字符串长度。 为什么添加另一个字符会减少所用的内存? 在这个计算中,你每添加一个“@”,就会再增加一个字节。 当然,您可以减少使用的变量数,但您需要通过额外的工作再次将它们分开来实现此“优势”。 - DBX12
2
@DBX12 虽然这个技巧不能节省内存,但是你可以通过它绕过 php.ini 中的 max_input_vars 选项。虽然不完全符合要求,但仍然很有用。 - RicoBrassers
大小限制超出取决于两个因素: 首先,单个键/值字符串的大小,即键和/或值侧的字符计数。 其次,键/值对的数量,即使每个对具有较小的字符数量。 总体上,以上两个因素都会导致大小限制超出问题。因此,对我来说,这个答案是正确的,与问题相关,并突出了问题的一面。 - Elnur Shabanov

1

是否有限制取决于HTTP服务器的决定。我所工作的产品允许管理员配置限制。


此外,在PNP.INI文件中有一个设置:max_input_vars在我的PHP版本5.4.16中,默认值为1000。从手册中可以看到: “可以接受多少个输入变量(限制分别应用于$ _GET,$ _POST和$ _COOKIE超全局变量)”参考资料:http://www.php.net/manual/en/info.configuration.php#ini.max-input-vars - Nikolay Ivanov

0

针对无法更改 PHP 配置的开发人员,因为受到 Web 托管的限制。(我的设置是 256MB 的最大大小,1000 个最大变量)

我遇到了同样的问题,即在服务器端仅收到了 5 个大型数据对象(关联数组)中的 2 个,这些对象具有子结构。

我发现整个子结构在 POST 请求中被“展平”。因此,一个对象变成了数百个文字变量。最终,实际上发送了数以千计的基本变量,而不是 5 个对象变量。

解决方案是将每个子结构序列化为字符串。然后,在服务器上作为 5 个字符串变量接收。 例如: {variable1:JSON.stringify(myDataObject1),variable2:JSON.stringify(myDataObject2)...}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接