清空没有Content-type的$ _POST

PiT*_*ber 4 javascript php

如果我发出POST请求,其中未在请求标头中设置content-type,则变量$ _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);
Run Code Online (Sandbox Code Playgroud)

test_out.php会的

var_dump($_POST);
Run Code Online (Sandbox Code Playgroud)

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

这更像是一个教育问题.我问这个是因为这里的大多数人无法想象内容类型有这种效果.我被要求'回来说实话'.所以,你走了.

mar*_*rio 7

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

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

parse_str(file_get_contents("php://input"), $_POST);
Run Code Online (Sandbox Code Playgroud)

这应该重新创建POST数组,就像PHP一样.

  • 因为我说很多人都不知道这个,我想要一个关于这个问题的未解决的问题.我学到了很多阅读问题,我希望其他人也能这样做.另外我认为处理我的其他问题并不公平. (3认同)
  • 太好了,完美的答案!上次我问[同样的问题](http://stackoverflow.com/questions/8183397/how-to-get-post-parameters-with-wrong-header) 我得到了 -3 票和 +6 票错误评论然后他们结束了这个问题。只有一个人 (hakre) 指出了正确的方向。我认为由于缺乏知识而关闭问题是可悲的。 (2认同)