【问题标题】:Is this a cross-domain or cross-protocol request?这是跨域还是跨协议请求?
【发布时间】:2019-06-22 18:53:06
【问题描述】:

我遇到了一个让我难以调试的错误。 它发生在 Angular2 中的 http GET 中,如下所示:

constructor(private http: Http) {}

...

this.http.get('someApi.abc.com/stuff?params`)

失败并出现如下错误:

XMLHttpRequest 无法加载 http://someApi.abc.com/stuff?params' 到 'http://elsewhere.abc.com/' 已被 CORS 策略阻止:否 'Access-Control-Allow-Origin' 标头出现在请求的 资源。因此不允许使用原点“http://local.abc.com” 访问。

我认为有 2 个问题:我不理解的重定向(可能需要联系 someApi 所有者?)和 CORS 问题。

我的理解是域名是:abc.com 协议是:http 所以不应该涉及 CORS 废话。我显然错了,但不明白为什么:(

【问题讨论】:

  • 您的应用后端必须可用

标签: javascript angular rest cors same-origin-policy


【解决方案1】:

同源策略基于需要完全匹配的域。 local.abc.comsomeApi.abc.com 不完全匹配。所以http://local.abc.comhttp://someApi.abc.com 是两个完全不同的起源。因此,如果您有在源 http://local.abc.com 运行的前端 JavaScript 代码并向 http://someApi.abc.com 发出请求,那么这是一个跨源请求,因此 CORS 参与其中;具体来说,如果http://someApi.abc.com 站点未在其响应中发送Access-Control-Allow-Origin 响应标头,浏览器将不允许您的前端JavaScript 代码访问此类请求的响应。

【讨论】:

  • 我明白了。我没有意识到 someApi 也需要匹配。然后它必须是跨域的,并且它在 API 上以在响应中返回 Access-Control-Allow-Origin 标头。我需要对我的标题做任何事情以确保这能正常工作吗?
  • 就 CORS 协议而言,您无需从前端代码对客户端的标头做任何事情。从客户端发送特殊 CORS 标头的唯一情况是 Access-Control-Request-Headers 和 Access-Control-Request-Method 请求标头 - 但这些是由浏览器自动发送的,并且仅适用于 CORS 预检 OPTIONS 请求浏览器自己做。 Origin 请求标头也是 CORS 协议的一部分,总是针对来自前端 JS 的跨域请求发送 - 但同样,这是浏览器自动添加的请求标头
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2012-02-05
  • 2015-01-01
  • 2016-03-01
  • 2017-06-15
相关资源
最近更新 更多