使用带有Node和Express的IE10中的CORS的安全性错误

我正在构建一个托管在http://example.com上的Backbone应用程序,该应用程序使用https://api.example.com托管的API。 对于API,我使用带有Express.js框架的Node.js。 我的CORS解决方案似乎适用于除IE以外的每个主要浏览器(它甚至在IE10中失败)。

当从IE10发起请求时,请求永远不会到达API服务器。 据我所知,该请求甚至没有被发送。 当我使用IE10的开发人员工具检查请求时,请求标头和响应标头都是空白的。 当从任何其他浏览器发送请求时,将收到请求并正确生成响应。

这是我在控制台中看到的错误:

 SCRIPT 7002: XMLHttpRequest: Network Error 0x4c7, The operation was canceled by the user. 

该请求使用jQuery:

 $.ajax({ url: apiRoot + "/endpoint", success: function(response) { // Omitted irrelevant code } }); 

根据这篇文章,默认情况下在IE中禁用CORS并且必须启用CORS:

Internet Explorer忽略Access-Control-Allow标头,默认情况下禁止Internet区域的跨域访问。 要启用CORS,请转到工具 – > Internet选项 – >安全选项卡,单击“自定义级别”按钮。 找到其他 – >跨域访问数据源设置,然后选择“启用”选项。

果然,当我启用此设置时,请求会通过,一切正常。 但是,我已经读过这个设置实际上与CORS无关, 不应该影响它。 当使用此工具测试CORS兼容性时,无论是启用还是禁用此设置,IE10都会通过,这使我相信CORS 启用,我只是做错了。

此外,当我运行Fiddler时,一切似乎都应该起作用,因为Fiddler充当代理人。

作为参考,这是服务器端的CORS相关代码:

 res.header("Access-Control-Allow-Origin", "example.com"); res.header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS"); res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-File-Name, X-File-Size, X-File-Type"); res.header("Access-Control-Allow-Credentials", true); if (req.method == "OPTIONS") { res.send(200); } 

尝试使用HTTP而不是HTTPS将请求发送到API服务器。 问题听起来可能与服务器的SSL设置有关,而不是请求本身。 如果是这种情况,请尝试使用SSL设置。

 var options = { key: fs.readFileSync(key), cert: fs.readFileSync(certificate), ca: fs.readFileSync(CA), requestCert: false, }; https.createServer(options, app).listen(443); 

我有同样的问题,最后为了让事情变得更容易我做了一个nginx proxy_pass指令所以我把http://example.com/api指向http://api.example.com
然后在javascript代码中将请求example.com/api并且浏览器不会抱怨。

我知道这不是理想的,但并非所有浏览器都以相同的方式支持CORS,尤其是IE。 当您想要支持所有浏览器时,proxy_pass选项是最简单的方法。

在其他情况下,您将进行更改以使IE在IE中工作并破坏其他浏览器支持。 不是说这是不可能的,但需要更多的测试。

为了让我的CORS请求在IE中工作,我不得不像这样打电话:

 $.ajax({ url: apiRoot + "/endpoint", xhrFields: { withCredentials: true }, crossDomain: true, success: function(response) { // Omitted irrelevant code } });