node.js,express:对某个主机名的限制

时间:2014-01-16 10:05:21

标签: node.js express

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分: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();
  }
});

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