【问题标题】:I am getting No 'Access-Control-Allow-Origin' header when trying to call an API我在尝试调用 API 时没有收到“Access-Control-Allow-Origin”标头
【发布时间】:2017-01-25 21:43:02
【问题描述】:

编辑:可能值得注意的是,我是在 GoDaddy 注册的域,它通过掩码转发到我的 Bitnami IP。我的堆栈都在同一台服务器上,这就是为什么我不明白这个问题的跨站点性质。或者,也许我理解错了。请帮助我理解这个错误。

我知道还有其他类似的线程,但我没有看到任何与我的确切设置匹配的线程。

我有一个运行 AngularJS 站点的 Amazon AWS EC2 Bitnami MEAN 堆栈。我正在将一些我用一些 Python 脚本从外部收集的信息发布到 mongodb 中,然后我有一个 JS API,它通过端口 3000 成功发布了集合……据我所知,所有这些都是非常标准的。我刚刚学习这项技术,还很新手。

所以当我在 Chrome 中访问 API [URL]:3000/api 时,我会看到 JSON 结果。这不是问题。

当我的 Angular 站点的控制器尝试对 API URL 执行 $http GET 时,Express 会在我的 putty 控制台中记录并显示我确实在访问 API。

但是.. 当我 F12 调试时,Chrome 在页面上给了我这个甜蜜的错误:

XMLHttpRequest cannot load **URL**. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin **URL**' is therefore not allowed access.

抱歉所有虚假网址,我是 stackoverflow 的新手,它标记我使用“超过 2 个网址”,因为我没有 10 分。

非常感谢您帮助我理解这个问题。

【问题讨论】:

  • 不能像那样跨域重定向 ajax 请求...让您的主机服务器充当代理并获取数据。另请注意,就 CORS 而言,不同的端口构成不同的来源
  • @charlietfl 我也在其他地方看到了这个解决方案。再次原谅我的新手。您能否将类似 ELI5 的内容与如何完成该代理或反向代理设置相关联?目前,这正在使用以下解决方案,允许所有 CORS。我只有 GET,它是一个公共免费网站,所以确实没有安全问题,但我想正确地做。 =o)

标签: angularjs api cors jsonp mean-stack


【解决方案1】:

此错误的原因很简单,您正在将 API 调用作为与您的 Angular 应用程序提供服务的域不同的域。 Chrome 或任何其他浏览器通常会引发 CORS 错误。

您需要做的是转到您的 API 并将运行 Angular 应用程序的域列入白名单。我不确定它是如何在 python 中完成的,但是在下面的 NodeJS 中我会这样做。

var cors = require('cors');
corsOptions = {
  origin: [
    'http://www.127.0.0.1:5555',
    'http://www.any-other-site-to-access.com'
  ],
  credentials: true
};
app.use(cors(corsOptions));

对于 python,这可能会有所帮助,但不确定 http://enable-cors.org/server_appengine.html

从 CORS 的文档中,启用所有的 CORS

var express = require('express')
  , cors = require('cors')
  , app = express();

app.use(cors());

app.get('/products/:id', function(req, res, next){
  res.json({msg: 'This is CORS-enabled for all origins!'});
});

app.listen(80, function(){
  console.log('CORS-enabled web server listening on port 80');
});

【讨论】:

  • 不要认为如果它是重定向它会那样工作......可能是错误的,但它会使正常的预检过程脱离循环
  • @charlietfl 我不确定我理解你的意思,如果他设置self.send_header("Access-Control-Allow-Origin", "*") 我认为它应该处理所有传入的请求,即使它是重定向
  • 所以我尝试在 EC2 Bitnami 上使用 sudo npm install cors 但它不会让我这样做。我得到的错误是:└── cors@2.8.1 extraneous 另外,我根据这个页面编辑了我的 httpd.conf 仍然没有爱:awesometoast.com/cors
  • @TomV 我认为这是一个单独的问题,我不确定我是否有足够的信息来了解您为什么会出现错误
  • @JamesOkpeGeorge 谢谢你,你这个漂亮的混蛋。有效。 CORS 全部打开。不知道这是否是我的 Apache2 httpd.conf 更改或什么的组合,但谢谢你的好先生。
猜你喜欢
  • 2016-01-21
  • 1970-01-01
  • 2016-05-13
  • 2017-09-19
  • 2015-04-02
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多