我目前正在将网页上的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无法看到标头是在飞行前请求的响应中返回的。
任何帮助将不胜感激,如果您需要更多信息,请询问。
谢谢, 詹姆斯
答案 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仅接受发送的第一个标头。
很抱歉,如果措辞不佳,请随意改善答案。