IE 11 上 CORS 预检请求的奇怪问题失败

Posted

技术标签:

【中文标题】IE 11 上 CORS 预检请求的奇怪问题失败【英文标题】:Strange issue with CORS preflight request fails on IE 11 【发布时间】:2015-03-10 14:42:59 【问题描述】:

问题是 IE11 上的 POST 查询失败,在所有其他浏览器中它似乎都在工作。

让我们一步一步描述问题:

    从应用程序到 REST API 的 XHR 请求。 预检 OPTIONS 请求(请求参数如下)
Accept:                         */*
Origin:                         https://app.example.com
Access-Control-Request-Method:  POST
Access-Control-Request-Headers  content-type, accept
:                               
Accept-Encoding:                gzip, deflate
User-Agent:                     Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
Host:                           api.example.com
Content-Length:                 0
Connection:                     Keep-Alive
Cache-Control:                  no-cache
    预检请求响应参数为:
X-Powered-By:                   Sugar
Access-Control-Allow-Origin:    https://app.example.com
Vary:                           Origin
Access-Control-Allow-Credentia  true
ls:                             
Access-Control-Allow-Methods:   GET,POST,DELETE,OPTIONS
Access-Control-Allow-Headers:   X-Requested-With,X-HTTP-Method-Override,Content-Type,Accept
set-cookie:                     sugar.sid=s%Pb9OoTTPUkVw%2F2vUPoFMNG
                                LMXACSkQevo; Path=/; Expires=Thu, 15 Jan 2015 18:27:07 GMT; HttpOnly; Secure
Date:                           Mon, 12 Jan 2015 18:27:07 GMT
Connection:                     close
    预检请求参数后的真实HTTP请求:
Accept:           application/json
Content-Type:     application/json
Referer:          https://app.example.com/
Accept-Language:  en-US
Origin:           https://app.example.com
Accept-Encoding:  gzip, deflate
User-Agent:       Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
Host:             api.example.com
Content-Length:   9
Connection:       Keep-Alive
Cache-Control:    no-cache
Cookie:           sugar.sid=s%3A-%2FGF1YoFmRfmBsxK4vLBoGjY5NT0QoYvf5s;
    最后响应参数:
Content-Type:    application/json; charset=utf-8
Content-Length:  72
Vary:            Accept-Encoding
Date:            Mon, 12 Jan 2015 18:27:07 GMT
Connection:      close
    基本上响应以 IE 错误结束: Origin: https://app.example.com not found in Access-Control-Allow-Origin 标头。第一个请求是否还需要 Access-**-Origin 标头,这似乎缺少。

也按照 CORS 流程图调试问题,但我无法发现它http://www.html5rocks.com/static/images/cors_server_flowchart.png。

我正在使用带有 node-cors 模块 + 修改选项的 Node.js Express 服务器。

【问题讨论】:

实际的数据响应需要一个 ACAO 头 刚刚测试过这似乎是问题所在,在 Chrome 上响应具有 AC 标头,但在 IE 上这些没有设置在真实数据上。 【参考方案1】:

我正在使用 Fiddler 在我的网站上调试此问题并收到以下消息:

HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Date: Mon, 12 Sep 2016 19:40:20 GMT
Content-Length: 103

"Message":"The collection of headers 'accept,if-modified-since,cache-control,pragma' is not allowed."

CORS the collection of headers accept,if-modified-since,cache-control,pragma

所以我刚刚在我的 web.api 中添加了 CORS 的缺失标头列表。

我希望这对某人有所帮助。

【讨论】:

以上是关于IE 11 上 CORS 预检请求的奇怪问题失败的主要内容,如果未能解决你的问题,请参考以下文章

来自 S3 CORS 的 AJAX GET 在预检选项上失败,出现 403

SCRIPT7002:XMLHttpRequest:网络错误 0x80070005,成功预检请求后拒绝访问

Tomcat CORS:预检成功,但实际请求失败,403 被禁止

预检失败时如何通过属性而不是通过 Application_BeginRequest 启用 CORS

cors 在本地主机上工作,但不在生产上

Mac 浏览器似乎吞下了最初的 CORS XHR 预检请求