如果 'Content-Type: application/json' 在标头中,则未创建 PHP 5.4.9 $_POST 超全局

Posted

技术标签:

【中文标题】如果 \'Content-Type: application/json\' 在标头中,则未创建 PHP 5.4.9 $_POST 超全局【英文标题】:PHP 5.4.9 $_POST superglobal not created if 'Content-Type: application/json' is in header如果 'Content-Type: application/json' 在标头中,则未创建 PHP 5.4.9 $_POST 超全局 【发布时间】:2012-12-21 17:00:40 【问题描述】:

我注意到在我的应用程序中使用 AWS Elastic Beanstalk php 5.4.9 AMI 时发生了一个奇怪的错误。

提交包含标头'Content-Type: application/json' 的GET AJAX 请求时,$_POST 超全局设置为空。如果我删除该标题,它将按预期设置为空白array()

这是预期的行为吗?

【问题讨论】:

文档中没有任何内容暗示这在 PHP > 5.4 中是预期的。我没有运行 PHP 5.4.9。但是,如果您可以通过执行上述操作来复制它,我会提交一个错误。 我记得关于 SO 的一个问题也是关于 $_POSTNULL。我不知道这是否与 AJAX 或 Json 内容类型请求标头有关。我不知道这是否已经解决了。我建议您在此处设置一些测试用例并概述如何重现。顺便说一句:如果您执行 GET 请求,则没有请求正文,因此没有 Content-Type 请求标头,因此看起来有点虚假。当然,这并不能解释 NULL$_POST,但人们可能也不应该期望太多。 你有一个测试用例来证明这一点吗?顺便说一句,如果你正在做一个 GET 那么 $_POST 不应该包含任何东西(尽管我相信它应该总是作为一个空数组存在) 我的 JS 框架 (spine.js) 始终包含该标头,无论它是 GET 还是 POST。我的服务器端框架 (Symfony2) 期望 $_POST 始终是一个数组。在 AWS 将 php 更新到 5.4.9 之前,这从来都不是问题。我会做更多的测试并报告。 看起来好像是 PECL HTTP 扩展导致了问题。 【参考方案1】:

原来这是 PECL 的问题。在运行 PHP 5.4 安装 PECL HTTP 时,当为 GET 请求提供“Content-Type: application/json”标头时,它会导致 $_POST 设置为 null。删除 PECL HTTP 解决了这个问题。

感谢 Michael@AWS 的发现。交叉线程:https://forums.aws.amazon.com/message.jspa?messageID=413836

编辑:由 PHP 团队修复:https://bugs.php.net/bug.php?id=63947&edit=2

【讨论】:

以上是关于如果 'Content-Type: application/json' 在标头中,则未创建 PHP 5.4.9 $_POST 超全局的主要内容,如果未能解决你的问题,请参考以下文章

使用注解格化日期

vue中main.js配置后端请求地址

来自 Flutter Web 的 HTTP Post 请求

Python3.x:requests的用法

MobileNet V12017-CVPR-MobileNets Efficient Convolutional Neural Networks for Mobile Vision Applica

MobileNet V12017-CVPR-MobileNets Efficient Convolutional Neural Networks for Mobile Vision Applica