这个问题几乎与一年前未回答的问题相同:
我希望找到一个解决方案,并且可以提供比原始问题更多的细节。
背景
我有一个服务器端 php 脚本,它应该从表单或 XHR 请求中获取 POST 数据。当我使用提交表单测试网站时,它可以在 Chrome 和 IE9 中运行。但是,当我使用 XHR 生成请求时,在客户端使用 Chrome 时未定义 php POST 变量。这种行为是不一致的:大约 20 次尝试中的 1 次,php 确实接受了数据。
我检查了php://input
流,发现在所有情况下都将发布数据发送到服务器;$_SERVER
请注意,测试用例之间的一小部分 HTTP 标头 ( ) 是不同的。
代码
服务器端:
<?php
echo file_get_contents("php://input") . "\n";
print_r($_SERVER);
print_r($_POST);
?>
客户端表单版本(Chrome 和 IE9 都可以)
<form action="scriptName.php" method="post">
Field: <input type="text" name="myField"><br>
<input type="submit" value="Submit">
</form>
客户端 XHR 版本(IE9 始终有效,Chrome 约 5% 的时间有效)
<script>
function postToURL(url,data)
{
// Typical XHLHttpRequest declarations are removed for brevity
// - checks browser type and declares xmlhttp accordingly
// - defines a onreadystatechange handle
xmlhttp.open("POST",url,false);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(data);
}
</script>
...
<form>
<button type="button" onClick="postToURL('scriptname.php','myField=test');">
Test
</button>
</form>
输出
在所有情况下,请求正文数据 ( php://input
) 返回相同的值。标题大多相同,但 Chrome[HTTP_PRAGMA] => no-cache
在 XHR 模式下添加了一个
在 Chrome + XHR 的情况下,该$_POST
变量被定义为except。[myField] => test
问题
问题可能发生在哪里?HTTP标头是否有问题,或者我应该查看服务器端。有任何想法吗?