【问题标题】:node.js, express: limit to certain hostnamenode.js,express:限制为某些主机名
【发布时间】:2014-02-05 04:15:06
【问题描述】:

我很难将我的 nodejs 应用程序限制为服务于某个主机名。您可以在调用 server.listen() 时specify the hostname,但在内部,我相信这一切只是将主机名解析为 IP 地址,即使文档声明“开始接受指定端口和主机名上的连接”。

举个例子:

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello');
}).listen(3000, 'host.tld');

(假设 host.tld 解析为 99.99.99.99)

无论主机名如何,该服务器都会处理发送到 3000 端口上的 99.99.99.99 的所有请求。

所以我想知道一种将我的应用程序限制为特定主机名的好方法。我当前的解决方案是检查请求的主机名并将其与我要服务的主机名进行比较。

示例(使用快递):

// Limit all requests to the specified hostname.
app.all('*', function(req, res, next) {
  if (req.host !== app.get('hostname')) {
    res.writeHead(404, {
      'Content-Type': 'text/plain'
    });
    res.end('Not found');
  } else {
    next();
  }
});

这似乎是一个 hack,虽然我还没有找到更好的方法来做到这一点。任何建议或指示将不胜感激。

【问题讨论】:

  • 我建议(出于许多其他原因)将 NGINX 作为 node.js 前面的反向代理。
  • @hgoebl 所以你要指定你的节点应用程序来监听本地主机并将主机名代理到本地主机:端口?我真的不想代理任何东西并在我的请求中添加另一层。你是说我不能在 node.js 中指定主机名?
  • 不,我不是这么说的。但在许多场景中,将 nginx 放在前面有很多优势(SSL 卸载、交付静态内容、对同一机器或不同机器上的节点集群进行负载均衡、解决同源策略问题、高可用性)。我的评论只是一个建议而不是答案;-)
  • 感谢您的建议。我试图了解这样做的最佳方式。我不需要这样做,我只想将我的应用程序限制为某个主机名。
  • 如果你觉得更舒服(非hacky),你可以看看npmjs.org/package/virtual-hoststackoverflow.com/questions/8503841

标签: node.js express


【解决方案1】:

您将需要使用中间件而不是 all 动词,具有相同的回调函数:

app.use(function(req, res, next) {
  if (req.host && req.host !== app.get('hostname')) { // req.host may be undefined if the client did not send host header
    res.writeHead(404, {
      'Content-Type': 'text/plain'
    });
    res.end('Not found');
  } else {
    next();
  }
});

这是 afaik 检查接受的 HTTP 主机名的唯一方法。

【讨论】:

  • 谢谢。我希望在 node.js 级别而不是在应用程序级别有解决方案。最后我通过 nginx 进行代理。
【解决方案2】:

我将在这里回答我自己的问题。简短的回答是,node.js 似乎无法“本机”处理这个问题(即,没有额外的应用程序逻辑)。如果有人不同意,请告诉我!

所以我的解决方案是通过 Nginx 去代理路由。这是我的 nginx 配置文件:

https://gist.github.com/badsyntax/8455064

这个答案可能对某些人也有帮助:https://stackoverflow.com/a/5015178/492325

【讨论】:

  • 感谢您分享您的解决方案(不仅仅是文字)
猜你喜欢
  • 2012-06-18
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多