为nodejs中的多个域启用Access-Control-Allow-Origin

我想在node.js中允许CORS,但问题是如果设置了Access-Control-Allow-Credentials ,我不能将*设置为Access-Control-Allow-Origin

此外,规范说,我不能做一个数组或逗号分隔值的Access-Control-Allow-Origin和build议的方法将做类似于这个访问控制,允许来源多个原产地域?

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

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

这里的问题是,它是由数组中的最后一个值覆盖,所以头将被设置为res.setHeader( "Access-Control-Allow-Origin", "http://mydomain.com:5001" );

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

XMLHttpRequest无法加载http://mydomain.com:9090/api/sync 。 “Access-Control-Allow-Origin”标头的值为“ http://mydomain.com:5001 ”,不等于提供的原点。 Origin'http: //mydomain.com:9001 '因此不被允许访问。

这是我在我的快速应用程序中使用,以允许多个来源

 app.use(function(req, res, next) { var allowedOrigins = ['http://127.0.0.1:8020', 'http://localhost:8020', 'http://127.0.0.1:9000', 'http://localhost:9000']; var origin = req.headers.origin; if(allowedOrigins.indexOf(origin) > -1){ 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(); }); 

不知道这是晚,但我解决了它通过设置:res.setHeader(“Access-Control-Allow-Origin”,req.headers.origin);

这将简单地允许每个连接作为headers.origin将与每个查询发送。 由于我总的Node.js和networkingnoob在一般情况下,我将不胜感激这个答案的任何意见。 此外,这可能会打破目的,限制接受的来源,并可能在生产中使用。

你可能想编写一个函数来检查req.headers.origin是否是一个列入白名单的域(来自硬编码数组),如果它存在于数组中,只需返回这个域。

检查你的白名单对你的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. } 

请享用。

这是一个简单的中间件function,可以从白名单中提供正确的CORS头。 将其设置在快速应用程序的顶部附近将允许您的所有路线在提供内容之前从白名单中设置正确的标题。

 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(); });