我正在构建一个托管在http://example.com
其上的主干应用程序,该应用程序利用托管在https://api.example.com
. 对于 API,我将 Node.js 与 Express.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
}
});
根据这篇文章,CORS 在 IE 中默认是禁用的,必须启用:
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);
}