在 Node.js 中为多个域启用 Access-Control-Allow-Origin [重复]

问题描述 投票:0回答:4

我试图在node.js中允许CORS,但问题是如果设置了

*
,我无法将
Access-Control-Allow-Origin
设置为
Access-Control-Allow-Credentials

规范还说我无法为

Access-Control-Allow-Origin
执行数组或逗号分隔值,建议的方法是执行类似于此的操作 Access-Control-Allow-Origin Multiple Origin Domains?

但我似乎无法在node.js中这样做

["http://example.com:9001", "http://example.com:5001"].map(domain => {
  res.setHeader("Access-Control-Allow-Origin", domain);
});
res.header("Access-Control-Allow-Credentials", true);

这里的问题是它被数组中的最后一个值覆盖,因此标题将被设置为

res.setHeader("Access-Control-Allow-Origin", "http://example.com:5001");

来自客户端浏览器的错误:

XMLHttpRequest 无法加载 http://example.com:9090/api/sync。这 “Access-Control-Allow-Origin”标头有一个值 'http://example.com:5001' 不等于提供的来源。 因此,不允许访问来源“http://example.com:9001”。

node.js cors
4个回答
277
投票

这是我在 Express 应用程序中使用的允许多个来源的内容

app.use((req, res, next) => {
  const allowedOrigins = ['http://127.0.0.1:8020', 'http://localhost:8020', 'http://127.0.0.1:9000', 'http://localhost:9000'];
  const origin = req.headers.origin;
  if (allowedOrigins.includes(origin)) {
       res.setHeader('Access-Control-Allow-Origin', origin);
  }
  //res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020');
  res.header('Access-Control-Allow-Methods', 'GET, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  res.header('Access-Control-Allow-Credentials', true);
  return next();
});

15
投票

不确定这是否为时已晚,但我通过设置解决了这个问题:

res.setHeader("Access-Control-Allow-Origin", req.headers.origin);

这将简单地允许每个连接,因为

headers.origin
将随每个查询一起发送。

您可能想要编写一个函数来检查

req.headers.origin
是否是白名单域(来自硬编码数组),然后简单地返回该域(如果数组中存在)。


10
投票

根据您的 req.headers.origin 检查您的白名单

var origins = ['a.com', 'b.com', 'c.com', 'boobies.com'];
for(var i=0;i<origins.length;i++){
    var origin = origins[i];
    if(req.headers.origin.indexOf(origin) > -1){ 
         res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
         return;
    }
    // else, tough cookies. 
}

享受吧。


9
投票

这是一个简单的中间件函数,用于从白名单中提供正确的 CORS 标头。将其设置在 Express 应用程序顶部附近将允许您的所有路由在提供内容之前从白名单中设置正确的标头。

app.use(function(req, res, next){
  var whitelist = ['localhost:4000', 'localhost:3000', 'anydomain.com']
  var host = req.get('host');

  whitelist.forEach(function(val, key){
    if (host.indexOf(val) > -1){
      res.setHeader('Access-Control-Allow-Origin', host);
    }
  })

  next();
});
© www.soinside.com 2019 - 2024. All rights reserved.