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相对。 如果那是不可能的,你必须找到另一种不进行跨域调用的方法。 一些例子:
- JSONP(仅限GET)
- CORS(现代浏览器的工作非常好)
- 包括ifram +在窗口之间使用PostMessage
- 代理脚本
编辑:我会做的,首先通过设置这些标题允许你的API-SERVER一些东西:
header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: POST, GET, OPTIONS"); header("Access-Control-Allow-Headers: Authorization");
请注意,这与Internet Explorer无法正常工作,因此您必须使用: XDomainRequest
。 但这不允许您发送标头。 如果您必须发送标题跨域,请在几天前查看我的问题