CORS 的 Safari 问题:Access-Control-Allow-Origin 不允许来源

Safari issue with CORS: Origin is not allowed by Access-Control-Allow-Origin

我们的一台服务器上有一个基于 Node.js 的应用程序(姑且称之为 'my.apiserver.com')。我们的客户在不同域 (my.client.com) 中拥有网站。当用户访问我们客户的网站时,会从我们的服务器收到一系列 html 页面,并向我们的服务器发送基于 ajax 的请求。这似乎适用于所有设备和浏览器,但最新的 Safari 版本 (8) 除外。对于大多数(但奇怪的是不是全部)Safari-8 用户,他们收到的错误消息如下:

XMLHttpRequest cannot load http://my.apiserver.com/views/view1.html. Origin http://my.client.com is not allowed by Access-Control-Allow-Origin

XMLHttpRequest cannot load http://my.apiserver.com/ajax_endpoint1?id=12345. Origin http://my.client.com is not allowed by Access-Control-Allow-Origin

在我们的 app.js 文件中,节点应用程序的跨域安全设置如下:

/***************************************************************************/
/* configure CORS
/***************************************************************************/
app.use(function(req, res, next) {
  res.set('Access-Control-Allow-Origin', 'http://my.client.com');
  res.set('Access-Control-Allow-Credentials', true);
  res.set('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
  res.set('Access-Control-Allow-Headers', 'Origin, Product-Session, X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept, Referer, User-Agent');

  // intercept OPTIONS method
  if ('OPTIONS' == req.method) {
    res.send(200);
  }
  else {
    next();
  }
});

任何关于为什么我们的 cors 设置在最新的 Safari 上失败的任何见解将不胜感激。

谢谢

最终这不是 cors 问题,而是 cookie 问题。具体来说,这是一个第 3 方 cookie 问题,因为更高版本的 Safari 默认情况下不允许第 3 方 cookie。由于我们是第三方,因此没有存储或传递任何 cookie 数据以传回我们的服务器,并且由于某种原因该问题表现为 cors 错误。启用第 3 方 cookie 后,api 调用将按预期工作。当然现在我们需要解决cookies的问题。

您可以从浏览器的 Develop 菜单中 Empty Cachesdisable Cross-Origin Restrictions(用于开发目的)。

对我有用。