“对预检请求的响应未通过访问控制检查”是啥意思?

Posted

技术标签:

【中文标题】“对预检请求的响应未通过访问控制检查”是啥意思?【英文标题】:What does "Response to preflight request doesn't pass access control check" mean?“对预检请求的响应未通过访问控制检查”是什么意思? 【发布时间】:2018-08-16 15:09:38 【问题描述】:

我在 Chrome 中尝试通过 ajax 请求访问 API 时收到以下响应:

“无法加载http://localhost:1880/api_resource:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源http://localhost:3000 。”

从消息中可以看出,客户端和 API 都在本地运行。

我了解这种情况与 CORS 跨源请求有关。我看到堆栈溢出时也有类似的问题,但从这些答案中我不明白消息告诉我什么以及它来自哪里。

具体而言,我理解 response 标头“Access-Control-Allow-Origin”必须设置(通常为“*”)以允许从不同域访问 API正在服务的 API。但是该消息似乎与请求有关,而不是响应,据我所知,没有任何请求到达 API。

什么是预检请求,它是如何失败的?

【问题讨论】:

【参考方案1】:

在我的情况下,问题出在我的网站地址上,我从同一台服务器调用所有 API,但出现此错误。

我的网站地址是 sateh.ir 所以我的ajax请求我设置了url:http://sateh.ir/api/...

在收到此错误并处理了几个小时后,我知道我必须将 ajax url 设置为:http://www.sateh.ir/api/...

如果我不输入“www”,我不知道为什么我的网站无法理解我从同一台服务器调用 api,但那是我的问题。

【讨论】:

【参考方案2】:

据我所知,现代浏览器会在实际的跨源请求之前发出“预检”请求。此预检请求使用“OPTIONS”HTTP 动词以及 CORS 标头 Access-Control-Request-MethodAccess-Control-Request-Headers实际的(GET/POST/PUT)请求。

消息“对预检请求的响应未通过访问控制检查”表示浏览器在选项响应中未看到有效的“Access-Control-Allow-Origin”标头。

在我的情况下,这是因为服务器(实现 REST API)设置为正确响应 PUT 和 POST 请求,但未设置为响应带有 CORS 标头的 OPTIONS 请求。

【讨论】:

以上是关于“对预检请求的响应未通过访问控制检查”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

对预检请求的响应未通过访问控制检查

对预检请求的响应未通过访问控制检查

对预检请求的响应未通过访问控制检查

CORS:对预检请求的响应未通过访问控制检查:预检请求不允许重定向

为啥 CORS 错误“对预检请求的响应未通过访问控制检查”?

Express - 无法发送重定向,对预检请求的响应未通过访问控制检查