4

我正在构建一个托管在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);
}
4

3 回答 3

2

尝试使用 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);
于 2013-08-27T16:52:11.233 回答
0

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

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

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

于 2013-08-27T10:33:35.773 回答
0

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

$.ajax({
  url: apiRoot + "/endpoint",
  xhrFields: {
     withCredentials: true
  },
  crossDomain: true,
  success: function(response) {
    // Omitted irrelevant code
  }
});
于 2018-04-12T20:16:22.757 回答