我正在构建一个托管在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 } });
根据this文章,默认情况下在IE中禁用CORS并且必须启用CORS:
Internet Explorer ignores Access-Control-Allow headers and by default
prohibits cross-origin access for Internet Zone. To enable CORS go to
Tools->Internet Options->Security tab,click on “Custom Level” button.
Find the Miscellaneous -> Access data sources across domains setting
and select “Enable” option.
果然,当我启用此设置时,请求会通过,一切正常.但是,我已经读过这个设置实际上与CORS无关,不应该影响它.当使用this tool测试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);