清空没有Content-type的$ _POST

时间:2011-11-21 15:13:52

标签: php javascript

如果我发出POST请求,其中未在请求标头中设置content-type,则变量$ _POST仍为空。

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

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

$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 中的变量会神奇地消失

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

1 个答案:

答案 0 :(得分:7)

如果必须,可以使用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一样。