13

我正在尝试从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);
});

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

4

5 回答 5

15

如果您希望每个人都能够访问 Node 应用程序,请尝试使用

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

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

如果您使用的是 Chrome,请查看有关 localhost 和 Access-Control-Allow-Origin错误错误。这里还有另一个StackOverflow 问题详细说明了该问题。

于 2013-04-16T20:46:57.297 回答
0

如果您正在对您的 localhost 进行 fetch 调用,我猜它是由 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');
});
于 2013-04-16T20:42:44.110 回答
0

有 2 个调用需要设置正确的标头。最初有一个预检检查,所以你需要类似...

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

然后具有以下功能...

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('Access-Control-Allow-Origin', "*") 这意味着任何人都可以访问您的网站!

于 2013-07-13T08:53:38.077 回答
0

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

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

通过任何其他域

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

如果它不包含在列表中,则发回服务器主机名,因此浏览器将隐藏这些请求的响应。

这更加安全,因为通过允许来源*和允许凭据,每个人都将能够例如窃取登录用户的个人资料数据等......

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

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

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

于 2014-08-22T15:14:18.363 回答
0

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

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();
    });
于 2017-12-07T08:15:29.163 回答