AJAX postdata 在本地主机上工作但不在 (Apache) 服务器上工作
AJAX postdata working on localhost but not on (Apache) server
我发现了一个问题,即邮政数据未通过我服务器上的 AJAX 发送。为了调试它,我编写了以下相当简约的 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 本地主机或我拥有的另一个 Apache 服务器中时,它确实将 postdata_contents 中的任何内容作为 postdata 传递。退出(var_dump($_POST));确实表明它工作正常,并且确实打印了我传递给它的 postdata 的值。
然而,当 运行 Apache 服务器上的同一段代码不起作用时,我得到的只是 « array(0) { } »,因为没有传递任何 postdata PHP 文件。
这是请求详细信息的 Firefox 开发工具视图(法语,对不起,但应该很明显是什么):
调试工具显示 postdata 内容正在正确发送:
然而,返回的内容显示 postdata 不知何故未通过:
在我的本地主机和我的其他 Apache 服务器上,一切都是 完全相同 直到最后一步,postdata 被正确传递(var_dump 消息是样式化,但您可以很容易地看出它的要点:postdata_test 是 $_POST 的一部分):
经过数小时摆弄此 Apache 服务器的配置并尝试了所有我能想到的调试方法和断点之后,我的神经太紧张了,暂时无法继续理性地思考这个问题。由于我无法选择使用另一台服务器或只是在新服务器上复制粘贴我的本地 Apache 配置文件,所以我将这个问题推迟给大家,希望有人能弄清楚或者曾经遇到过类似的问题。
提前致谢,
埃里克 B.
我自己无意中解决了这个问题,我在服务器上激活了 mod_dumpio 并且在我关闭它后它就开始工作了。
我不知道 mod_dumpio 做了什么来拒绝 XHR POST 而不是通用 HTTP POST,但至少已经解决了。
希望有一天这会对其他人有所帮助。
(在旁注中,我意识到我示例中的 postdata 查询格式错误,应该是 « postdata_test= » 而不是 « postdata_test »,所以如果您是卡在我的情况下,想要 运行 我做过的相同测试)
我发现了一个问题,即邮政数据未通过我服务器上的 AJAX 发送。为了调试它,我编写了以下相当简约的 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 本地主机或我拥有的另一个 Apache 服务器中时,它确实将 postdata_contents 中的任何内容作为 postdata 传递。退出(var_dump($_POST));确实表明它工作正常,并且确实打印了我传递给它的 postdata 的值。
然而,当 运行 Apache 服务器上的同一段代码不起作用时,我得到的只是 « array(0) { } »,因为没有传递任何 postdata PHP 文件。
这是请求详细信息的 Firefox 开发工具视图(法语,对不起,但应该很明显是什么):
调试工具显示 postdata 内容正在正确发送:
然而,返回的内容显示 postdata 不知何故未通过:
在我的本地主机和我的其他 Apache 服务器上,一切都是 完全相同 直到最后一步,postdata 被正确传递(var_dump 消息是样式化,但您可以很容易地看出它的要点:postdata_test 是 $_POST 的一部分):
经过数小时摆弄此 Apache 服务器的配置并尝试了所有我能想到的调试方法和断点之后,我的神经太紧张了,暂时无法继续理性地思考这个问题。由于我无法选择使用另一台服务器或只是在新服务器上复制粘贴我的本地 Apache 配置文件,所以我将这个问题推迟给大家,希望有人能弄清楚或者曾经遇到过类似的问题。
提前致谢, 埃里克 B.
我自己无意中解决了这个问题,我在服务器上激活了 mod_dumpio 并且在我关闭它后它就开始工作了。
我不知道 mod_dumpio 做了什么来拒绝 XHR POST 而不是通用 HTTP POST,但至少已经解决了。
希望有一天这会对其他人有所帮助。
(在旁注中,我意识到我示例中的 postdata 查询格式错误,应该是 « postdata_test= » 而不是 « postdata_test »,所以如果您是卡在我的情况下,想要 运行 我做过的相同测试)