为啥一些跨域 XMLHttpRequest 请求不返回 CORS 错误

Posted

技术标签:

【中文标题】为啥一些跨域 XMLHttpRequest 请求不返回 CORS 错误【英文标题】:Why do some cross domain XMLHttpRequest requests NOT return CORS error为什么一些跨域 XMLHttpRequest 请求不返回 CORS 错误 【发布时间】:2017-08-08 08:42:32 【问题描述】:

对于某些 API,数据很容易访问,并且不会引发以下 CORS 错误。

XMLHttpRequest 无法加载 http://external.service/。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://my.app' 因此不允许访问。

我很困惑为什么它不会引发错误。

在 Node.js 中,当我想在我的服务器上启用 CORS 时,我必须这样做:

res.header("Access-Control-Allow-Origin", "*");

res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

我假设以下 API 已以类似方式设置,但我正在寻找验证是否属实。我希望我的理解在技术上是准确的。

如果有其他解释,我想知道。

一些不引发 CORS 错误的 API 示例如下:

https://itunes.apple.com/hk/rss/topalbums/limit=10/json

http://www.omdbapi.com/?s=Star%20Wars&r=json

https://api.github.com/users/用户名

【问题讨论】:

你看标题了吗? 他们都发出access-control-allow-origin 标题 - 那么,问题是什么? 没有答案。就像我在查询中所说的那样,我只是想要验证。 保证如果浏览器发出成功的跨源请求,则服务器正在发送 CORS 标头 ... CORS 不是“可选”且不能“绕过” 当你说 CORS 不能被绕过时,我很困惑。当发送“access-control-allow-origin”标头并且数据可用时,会调用什么? CORS 是一个无法绕过的标准,但是通过设置标头可以访问数据并绕过错误 - 正确吗? 【参考方案1】:

是的,您的理解在技术上是准确的。您可以从您提到的 API 示例(或任何其他支持 CORS)的响应中看到标头,并且它们都像您一样包含标头在您的 Node.js 应用程序中。

现在他们可能不会在 Node.js 中这样做,但为响应添加标头是所有可能的 Web 框架的基本内容,或者只是在 Web 服务器本身中设置一些配置的问题。

这是一个Postman 屏幕截图,显示了来自 github api 响应的标头。

【讨论】:

以上是关于为啥一些跨域 XMLHttpRequest 请求不返回 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥跨域 JSONP 安全,但跨域 JSON 不安全?

XMLHttpRequest 无法加载 https://[website].com 不支持跨域请求

Ajax跨域

浅析跨域请求

产生ajax跨域问题的原因

产生ajax跨域问题的原因