IE CORS-即使指定了标头,Access-Control-Allow-Headers错误

Jam*_* B. 3 javascript internet-explorer access-control cross-domain cors

我目前正在将网页上的AJAX请求提交给在Chrome和Firefox中可使用但在IE中无法使用的API端点。

我在IE开发工具中收到的错误消息是:

SEC7123: Request header x-custom-header was not present in the Access-Control-Allow-Headers list.
SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.
Run Code Online (Sandbox Code Playgroud)


查看飞行前OPTIONS请求,以下是一些标头:

Origin: http://www.example.org
Access-Control-Request-Headers: content-type, accept, x-custom-header
Access-Control-Request-Method: GET
Run Code Online (Sandbox Code Playgroud)

飞行前的响应显示:

Access-Control-Allow-Headers: content-type, x-custom-header
Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS
Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)


发生这种情况后,将不会执行AJAX请求。看来IE无法看到标头是在飞行前请求的响应中返回的。


任何帮助将不胜感激,如果您需要更多信息,请询问。

谢谢,詹姆斯

小智 6

我们遇到了 Internet Explorer 和 Access-Control-Allow-Methods 的 CORS 问题,它们与 OPTIONS 响应中的允许“*​​”不兼容。修复是在我们的 API 网关中更改选项响应以使用所有方法


Jam*_* B. 5

好的,我找到了解决方案。事实证明,IE强制将标头的值包含在逗号分隔的列表中,并且飞行前请求正在使用相同的键响应多个标头。(即使W3表示这样做也可以https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2

尽管在技术上不同的标头具有相同的名称,但网络选项卡上的所有开发工具(包括IE)都将标头组合在一起,并以逗号分隔的列表形式出现。这就是混乱的来源。

这是在使用Postman模拟飞行前请求并看到标头作为单独的项目返回时发现的。

因此,要解决此问题,请确保CORS标头(例如“ access-control-allow-headers”)包含逗号分隔的列表,而不是必需的标头,因为IE仅接受发送的第一个标头。


抱歉,如果措辞不佳,请随意改善答案。