【问题标题】:Empty $_POST without Content-type没有内容类型的空 $_POST
【发布时间】:2011-11-21 15:13:51
【问题描述】:

如果我在请求标头中未设置内容类型的情况下发出 POST 请求,则变量 $_POST 保持为空。

问题:如何强制 PHP 填充 $_POST?

我遇到了使用 XDomainRequest 发出 Javascript AJAX 请求的问题,您无法定义任何标头。只是为了让您更容易理解问题,您可以通过这种方式在 PHP 中模拟没有 Javascript 的相同效果:

$data = 'test=1';

$fp = fsockopen('www.yourpage.org', 80, $errno, $errstr, 5);
fputs($fp, "POST /test_out.php HTTP/1.1\r\n");
fputs($fp, "Host: www.yourpage.org\r\n");
//fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);

while(!feof($fp)) { echo fgets($fp, 128); }
fclose($fp);

test_out.php 是

var_dump($_POST);

如果没有正确的内容类型,$_POST 中的变量会神奇地消失

这更像是一个教育问题。我问这个是因为这里的大多数人都无法想象内容类型具有这种效果。我被要求“带着事实回来”。所以你去吧。

【问题讨论】:

  • 它没有什么神奇之处。这就是 PHP 的工作方式(以及任何其他 CGI 解释器)。见php-src/main/rfc1867.c——不知道你的问题是什么。为什么要省略必需的标头?
  • 我不想。 XDomainRequest 做到了这一点,并且没有办法解决它,因为您无法添加自定义标头。我用“问题:”标记了问题。
  • 太棒了。从事 php rest 服务。突然 $_POST 消失了。是的。没有内容类型。如果我们接受独特的内容类型,我们花了很长时间才弄清楚如何取回 $_POST。非常感谢。

标签: php javascript


【解决方案1】:

如果需要,您可以使用 Apache mod_headers 覆盖/注入必要的标头。或者以其他方式手动重建 $_POST 数组。 (另见userland multipart/form-data handler

如果它始终是 urlencoded,只需从 php://input 读取(其中包含原始 POST 请求正文)并使用 parse_str

parse_str(file_get_contents("php://input"), $_POST);

这应该重新创建 POST 数组,就像 PHP 所做的那样。

【讨论】:

  • 太好了,完美的答案!上次我问same question 时,我在错误的 cmets 上获得了 -3 票和 +6 票,然后他们关闭了这个问题。只有一个人(hakre)指出了正确的方向。我认为由于缺乏知识而关闭问题是很可悲的。
  • 嗯,好的。小的配方问题经常会引起人们的反感。 ——可是为什么要问两次呢?看来您已经知道适当的解决方法了。
  • 因为我说很多人不知道这个,我想要一个关于这个的未结束的问题。我学到了很多阅读问题,我希望其他人也一样。我也认为我的其他问题的处理方式是不公平的。
猜你喜欢
  • 1970-01-01
  • 2014-06-17
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多