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(); });
- 通过socket.io使用backbone.js
- 无法从主干进行POST来expression
- handlebars.js Uncaught TypeError:Object#<Object> has no method'call'
- Backbone.js Node.js Express.js中的用户function
- 前端JavaScript框架与node.js
- Node.js / express.js / Backbone.js:req.body.keys是未定义的?
- backbone.js + node.js – express.js
- 整合Node.js和Backbone.js
- 使用Underscore模板定界符的节点项目在EJS视图中发生冲突