尝试使用ajax访问页面时,为什么会出现Access-Control-Allow-Origin错误?

时间:2010-12-03 00:26:27

标签: javascript ajax same-origin-policy

我正在尝试使用ajax从我希望能够在任何地方运行的脚本访问我网站上的某些数据。我的脚本中的ajax代码看起来像这样

var ajax = new XMLHttpRequest();
ajax.open('GET', 'http://mywebsite.com/page?i=2&json', true);
ajax.onreadystatechange = function() {
  if (ajax.status == 200) {
    console.log(JSON.parse(ajax.responseText));
  }
  else
    console.log('Could not connect.');
}
ajax.send();

但是当我运行它时我得到了错误

  

XMLHttpRequest无法加载   http://mywebsite.com/page?i=2&json。   原点http://anotherwebsite.com是   不允许的   访问控制允许来源。

在我网站上的脚本中,我在页面内有以下几行,

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET');

但我仍然得到同样的错误。我希望我的网站上的该页面可以通过ajax从因特网上的任何其他页面访问,因为我的脚本是一个应该可以在任何网站上使用的扩展。

编辑:如果我将ajax对象上的'withCredentials'属性设置为true并且在我的服务器上发送回Access-Control-Allow-Credentials标头设置为true,那么我的工作正常。然后使用我的脚本我也通过了域,因此可以在我的服务器脚本上的Access-Control-Allow-Origin中返回它。通配符*不起作用。目前仅在Chrome中对此进行了测试。

1 个答案:

答案 0 :(得分:1)

大多数浏览器都不允许您使用跨域ajax,因此您可以做的是调用本地服务器端脚本,该脚本使跨域ajax并将答案返回给您的javascript。 我听说它被称为“代理脚本”,是我所知道的唯一可靠的解决方案。

step 1: javascript on otherdomain.com --GET--> server-side script on otherdomain.com
step 2: server-side script on otherdomain.com --GET--> mywebsite.com/page?i=2&json
step 3: mywebsite.com/page?i=2&json --JSON--> server-side script on otherdomain.com
step 4: server-side script on otherdomain.com --JSON--> javascript on otherdomain.com