我发现在我的服务器上没有通过AJAX发送postdata的问题。为了调试它,我编写了以下相当简约的javascript来测试一个简单的AJAX调用:
function my_custom_ajax(target_page, target_element , postdata_contents) {
// Sending the XMLHttpRequest as postdata
var xhr = new XMLHttpRequest();
xhr.open("POST", target_page, true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
xhr.setRequestHeader("Content-length", postdata_contents.length);
xhr.setRequestHeader("Connection", "close");
xhr.send(postdata_contents);
// Waiting for the request to return
xhr.onreadystatechange = return_data;
// If all went well, we update the target element
function return_data()
{
if(xhr.readyState === 4)
{
if(xhr.status === 200)
{
// We update the target element
document.getElementById(target_element).innerHTML = xhr.responseText;
}
// Throw error in case of 404 or such
else
document.getElementById(target_element).innerHTML = "XHR can't be loaded";
}
// Throw error in case request got interrupted or didn't work out
else
document.getElementById(target_element).innerHTML = "XHR error";
}
}
使用以下HTML调用它:
<div onClick="my_custom_ajax('test_page.php?xhr','my_id','postdata_test');">
Click me
</div>
<div id="my_id">
xhr response will appear here
</div>
并调用仅包含此内容的PHP页面:
exit(var_dump($_POST));
在我的Apache localhost或我拥有的另一台Apache服务器上运行这段代码时,它确实传递了postdata_contents中的任何内容作为postdata。退出(var_dump($ _ POST));确实显示它正常工作,并打印传递给它的postdata的值。
但是,当在Apache服务器上运行同一段代码时,它不起作用,我得到的只是“array(0){}”,因为没有根据PHP文件传递postdata。
这是Firefox的开发工具查看请求详细信息(法语,对不起,但应该很明显是什么):
调试工具显示正确发送了postdata内容:
但是,返回的内容显示postdata以某种方式未通过:
在我的localhost和我的其他Apache服务器上,一切都完全相同,直到最后一步,postdata被正确传递(var_dump消息的样式,但你可以很容易地看到的主旨它:postdata_test是$ _POST的一部分:
经过几个小时的摆弄这个Apache服务器的配置并尝试了我能想到的所有调试方法和断点,我的神经过于紧张,现在还没有理性地继续思考这个问题。由于我没有选择使用其他服务器或者只是在新服务器上对我的本地Apache配置文件进行复制,我将这个问题推迟给大家,希望有人可以解决这个问题,或者曾经遇到类似问题。
提前致谢, Eric B.
答案 0 :(得分:1)
我自己解决了这个问题,我在服务器上激活了mod_dumpio,一旦关闭它就开始工作了。
我不知道mod_dumpio正在做什么来拒绝XHR POST而不是通用HTTP POST,但至少已经解决了。
希望有一天能帮到别人。
(在旁注中,我意识到我的示例中的postdata查询格式不正确,应该是«postdata_test =»而不是«postdata_test»,所以如果你遇到我的情况并希望运行同样的话,请添加等号我做过的测试)