Access-Control-Allow-Origin不允许来源http:// localhost

我正在尝试从backbone.js执行到我的node.js服务器。 但是,在控制台中出现以下错误:

Origin http://localhost is not allowed by Access-Control-Allow-Origin.

我添加了以下内容到我的node.js服务器:

 var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', "http://localhost"); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type'); }; app.configure(function() { app.use(allowCrossDomain); }); 

但它仍然返回相同的错误。 但是,即使这样做确实有效,但它似乎不是理想的解决scheme,因为我希望来自各地的用户能够发送请求。

如果您希望每个人都能够访问节点应用程序,然后尝试使用

 res.header('Access-Control-Allow-Origin', "*") 

这将允许来自任何来源的请求。 CORS启用站点有许多关于不同Access-Control-Allow头的信息以及如何使用它们。

我正在使用Chrome,请查看有关本地主机和Access-Control-Allow-Origin的bug。 这里有另一个StackOverflow的问题 ,详细的问题。

如果你正在调用你的本地主机,我猜是由node.js运行在你的骨干代码所在的同一目录下,而不是最有可能在http://localhost:3000东西。 比这应该是你的模式:

 var model = Backbone.Model.extend({ url: '/item' }); 

而在你的node.js中,你现在必须接受这样的调用:

 app.get('/item', function(req, res){ res.send('some info here'); }); 

有2个电话需要设置正确的标题。 最初有一个预检检查,所以你需要像…

 app.get('/item', item.list); app.options('/item', item.preflight); 

然后有以下function…

 exports.list = function (req, res) { Items.allItems(function (err, items) { ... res.header('Access-Control-Allow-Origin', "*"); // TODO - Make this more secure!! res.header('Access-Control-Allow-Methods', 'GET,PUT,POST'); res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept'); res.send(items); } ); }; 

和飞行前检查

 exports.preflight = function (req, res) { Items.allItems(function (err, items) { res.header('Access-Control-Allow-Origin', "*"); // TODO - Make this more secure!! res.header('Access-Control-Allow-Methods', 'GET,PUT,POST'); res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept'); res.send(200); } ); }; 

如果需要,可以将res.header()代码合并到一个函数中。

同样如上所述,小心使用res.header('访问控制允许来源',“*”)这意味着任何人都可以访问您的网站!

通过本地主机,你必须使用null原点。 我build议您创build一个允许的主机列表并检查请求的Host头。 如果列表中包含,则由本地主机发回

 res.header('Access-Control-Allow-Origin', "null"); 

由任何其他域名

 res.header('Access-Control-Allow-Origin', hostSentByTheRequestHeader); 

如果不包含在列表中,则返回服务器的主机名,这样浏览器就会隐藏这些请求的响应。

这是更安全的,因为通过允许来源*,并允许证书每个人将能够例如窃取login用户的个人资料数据等…

所以总结一下这样的事情:

 if (reqHost in allowedHosts) if (reqHost == "http://localhost") res.header('Access-Control-Allow-Origin', "null"); else res.header('Access-Control-Allow-Origin', reqHost); else res.header('Access-Control-Allow-Origin', serverHost); 

是最安全的解决scheme,如果你想允许多个其他域访问您的网页。 (我想你可以弄清楚如何通过node.js获取主机请求头和服务器主机)

这种方法解决了我的问题,以允许多个域

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