XMLHttpRequest跨域抛出错误

我为注册使用的网站的顶级网站制作了“投票”API。

  var id = 1; $(document).ready(function(){ $.getJSON("http://mysite.com/index.php?page=vote", { id: id, hasVoted: 'unknown' }, function(data) { if(data == 2) { window.location.replace("http://mysite.com/index.php?page=vote&id=" + id); } }); });  

基本上,我给用户他们的ID,然后他们把那些代码放在他们的文件中。 该网站返回一个数字,然后,它重定向用户或不重新投票。

因此,在localhost上测试代码会抛出此错误:

  XMLHttpRequest cannot load http://mysite.com/index.php?page=vote&id=1&hasVoted=unknown. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

如果我使用此代码:

   var id = 1; $(document).ready(function(){ $.getJSON("http://mysite.com/index.php?page=vote&callback=?", { id: id, hasVoted: 'unknown' }, function(data) { if(data == 2) { window.location.replace("http://mysite.com/index.php?page=vote&id=" + id); } }); });  

然后它什么也没做。 它不会引发任何错误。 (虽然数据应该等于2(当直接检查该URL时,它返回2))。

并且,如果我尝试做一点测试,并做alert(data); 它什么都没扔。

我对此完全无能为力。 一切都会有所帮助。

众所周知的问题,浏览器的原点控制:

默认情况下,浏览器不允许您向“跨域”域发出ajax请求。 交叉起源意味着端口或主机不同。 因此,在站点A上托管发出请求的脚本时,您无法向站点http:// siteB /发送请求。

简单的解决方案是在一个域上托管所有内容并使URL相对。 如果那是不可能的,你必须找到另一种不进行跨域调用的方法。 一些例子:

  1. JSONP(仅限GET)
  2. CORS(现代浏览器的工作非常好)
  3. 包括ifram +在窗口之间使用PostMessage
  4. 代理脚本

编辑:我会做的,首先通过设置这些标题允许你的API-SERVER一些东西:

 header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: POST, GET, OPTIONS"); header("Access-Control-Allow-Headers: Authorization"); 

请注意,这与Internet Explorer无法正常工作,因此您必须使用: XDomainRequest 。 但这不允许您发送标头。 如果您必须发送标题跨域,请在几天前查看我的问题