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

时间:2018-08-15 10:43:37

标签: javascript internet-explorer cors cross-domain access-control

我目前正在将网页上的AJAX请求提交到API端点,该端点可以在Chrome和Firefox中使用,但不能在IE中使用。

我在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.


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

Origin: http://www.example.org
Access-Control-Request-Headers: content-type, accept, x-custom-header
Access-Control-Request-Method: GET

飞行前的响应显示:

Access-Control-Allow-Headers: content-type, x-custom-header
Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS
Access-Control-Allow-Origin: *


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


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

谢谢, 詹姆斯

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

“网络”标签上的所有开发工具(包括IE)都将标头组合在一起,以逗号分隔的列表形式显示,即使它们在名称上是技术上不同的标头也是如此。这就是混乱的来源。

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

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


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