为什么我在尝试使用 ajax 访问页面时收到 Access-Control-Allow-Origin 错误?

发布于 2024-10-05 22:55:15 字数 1170 浏览 8 评论 0原文

我正在尝试使用 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 从 Internet 上的任何其他页面访问,因为我的脚本是一个应该可以在任何网站上使用的扩展。

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

I'm trying to use ajax to access some data on my website from a script that I want to be able to run anywhere. The ajax code from my script looks something like this

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();

But when I run it I get the error

XMLHttpRequest cannot load
http://mywebsite.com/page?i=2&json.
Origin http://anotherwebsite.com is
not allowed by
Access-Control-Allow-Origin.

On the script on my website I have the following lines inside of page,

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

But I still get the same error. I want that page on my website to be accessable from any other page on the Internet via ajax, because my script is an extension that should be usable on any website.

EDIT: Ok I got this working if I set the 'withCredentials' attribute on the ajax object to true and on my server send back Access-Control-Allow-Credentials header set to true. Then with my script I also passed the domain so it can be returned in Access-Control-Allow-Origin on my server script. The wildcard * didn't work. This is only tested in Chrome so far.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雪化雨蝶 2024-10-12 22:55:15

大多数浏览器不允许您执行跨域 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

Most browsers won't let you do cross-domain ajax, so what you could do is to make a call to a local server-side script that makes the cross-domain ajax and gives the answer back to your javascript.
I heard of it named as "proxy-script" and is the only reliable solution I know.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文