CORS规范指出,如果HTTP请求被认为是"简单的",则不需要CORS和/或预检。
我正在尝试执行似乎具有以下条件的HTTP请求:
- 我没有设置自定义 HTTP 标头。
- 我使用的是
POST
方法。 - 我正在使用
application/x-www-form-urlencoded
.
代码示例:
$.ajax({
type: 'POST',
url: 'http://example.org/',
data: {foo: 'bar'}
});
但是,在运行此请求时,请求仍使用OPTIONS
进行预检(失败)。我缺少什么明显的东西吗?
对简单请求的一些引用:
- https://w3c.github.io/webappsec-cors-for-developers/#cross-origin-send-permissions-simple-safelisted-request
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Simple_requests
CORS 限制会影响从一个域到另一个域的所有请求。 示例:本地主机 -> example.com。我最终只是转到我的 example.com 服务器端代码,并确保我启用来自我从中拨打电话 myotherexample.com 的请求。在本地开发时使用 CORS 标头执行此操作
Access-Control-Allow-Origin: *
准备生产时的另一个示例
Access-Control-Allow-Origin: https://myotherexample.com
我在重新阅读文档时意识到了我的错误。
我所做的确实是一个简单的要求。该请求实际上是在没有OPTIONS
请求的情况下发送到服务器的,并且成功了!
但是,当它回来时,我不允许阅读回复。因此,简单和非简单 CORS 请求之间的真正区别在于:
对于简单请求,不需要预检,但服务器仍需要使用 CORS 标头进行响应。
所以我的选择如下:
- 我忽略了这个错误。毕竟请求成功了,我只是看不懂响应。
- 无论如何,我都实现了 CORS 服务器端。就我而言,我不能,因为我无法控制目标服务器。
- 我使用 html 表单提交数据,调用
.submit()
并定位隐藏的 iFrame。
我 - 通过我控制的服务器代理请求。
前途:
我认为,但我不确定,新的 Fetch API 还允许一种模式,您可以在其中跨域发出 HTTP 请求,选择退出 CORS 并简单地被拒绝访问 HTTP 响应。如果这是正确的,那么这将是这样做的理想方式(对我来说)。但我不知道 100% 确定这是否确实是这样工作的。