我使用$.post
调用php文件。从服务器我返回json响应。当我直接在浏览器中打开服务器URL时,它会成功返回。但是从js开始它不起作用。
我调用的链接是这个(http://54.249.240.120/qcorner/login
)。
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
<input type="button" id="testID">
<script type="text/javascript">
$(document).ready(function() {
$("#testID").click(function() {
$.post('http://54.249.240.120/qcorner/login',function(result){
alert(result);
});
});
});
</script>
</body>
</html>
我也在Firefox中尝试过。在那我得到200 OK,但没有回应。
为什么会这样?
答案 0 :(得分:5)
问题是它是一个跨域请求,可以通过打开javascript控制台来查看返回的错误:
XMLHttpRequest cannot load http://54.249.240.120/qcorner/login. Origin null is not allowed by Access-Control-Allow-Origin.
您需要确保Access-Control-Allow-Origin
标头设置为允许这种情况发生,否则Chrome会取消请求。
答案 1 :(得分:1)
我怀疑你遇到了Cross-origin resource sharing问题。我猜你没有从http://54.249.240.120/
访问此页面,因为Chrome已在网络标签中明确显示(如果它是同一个域,通常不会这样做)。
长话短说,你不能通过Javascript发布到另一个域名。如果您在www.example.com上访问此页面,则浏览器将无法将该IP地址识别为相同的域名(即使域名在此处解析)。最简单的方法是,如果您掌控整个情况,只需将登录代码放在与您正在测试的代码相同的域中。在本地环境中,您可以使用[hosts文件,例如54.249.240.120 www.example.com
来执行此操作,以将example.com(替换为您正在访问测试页的自己的域)重定向到IP地址。但是,这不适用于公共互联网。
如果您必须通过javascript发布到另一个域,则需要考虑实施CORS标准。 Here's an article我找到了解释如何在PHP中实现它。
答案 2 :(得分:0)
HTML 200 OK与有效响应不同。这意味着服务器得到了您的请求,但这并不意味着您的PHP文件实际返回了可用数据。它可能会完全返回一个空响应。是时候调试PHP文件了。我建议暂时登录文件或使用FirePHP。如果错误显示被禁用(因为它应该在生产服务器上),如果您的脚本在生成任何输出之前失败,则会发生这种情况。
答案 3 :(得分:0)
请求究竟发生了什么?您不能使用您在问题中列出的内容跨域进行ajax请求。
但是,您正在向URL发送一个空的POST请求,当我复制一个空的post请求时,它会响应HTTP 206错误,这是您需要解决的问题。
curl -X POST http://54.249.240.120/qcorner/login
{"head":{"status":206,"message":"Only 0 fields received, required 2"},"body":""}
答案 4 :(得分:0)
我和你有同样的问题,我所做的很简单。 在接收ajax请求的PHP文件中,只需在发送响应之前添加此行:
<?php
header("Access-Control-Allow-Origin: *");
... // your code here
?>