node.js,express:限制为某些主机名

node.js,express:限制为某些主机名,node.js,express,Node.js,Express,我很难将我的nodejs应用程序限制为服务于特定主机名的应用程序。您可以在调用server.listen()时使用它,但在内部,我相信这只是将主机名解析为IP地址,即使文档中声明“开始接受指定端口和主机名上的连接” 以以下为例: var http=require('http'); http.createServer(函数(req,res){ res.writeHead(200,{'Content-Type':'text/plain'}); res.end(“你好”); }).listen(300

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

以以下为例:

var http=require('http');
http.createServer(函数(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end(“你好”);
}).listen(3000,'host.tld');
(假设host.tld解析为99.99.99.99)

该服务器将处理发送到端口3000上99.99.99.99的所有请求,而不考虑主机名

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

示例(使用express):

//将所有请求限制为指定的主机名。
应用程序所有('*',函数(req,res,next){
if(req.host!==app.get('hostname')){
书面记录(404{
“内容类型”:“文本/普通”
});
res.end(“未找到”);
}否则{
next();
}
});

这看起来像是一个黑客,尽管我还没有找到更好的方法。如有任何建议或建议,将不胜感激

您将需要使用中间件,而不是具有相同回调函数的
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主机名的唯一方法。

您需要使用中间件,而不是使用具有相同回调函数的
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执行代理路由。以下是我的nginx配置文件:


这个答案可能对一些人也有帮助:

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

因此,我的解决方案是通过Nginx执行代理路由。以下是我的nginx配置文件:


这个答案可能对某些人也有帮助:

我建议(出于许多其他原因)在node.js前面有一个反向代理。@hgoebl所以你要指定你的节点应用程序来监听localhost并将主机名代理给localhost:port?我真的不想代理任何东西,在我的请求中添加另一层。你是说我不能在node.js中指定主机名吗?不,我不是这么说的。但在许多情况下,将nginx放在前面有很多优势(SSL卸载、交付静态内容、在同一台机器或不同机器上的节点集群进行负载平衡、解决同源策略问题、高可用性)。我的评论只是一个建议而不是答案;-)我感谢你的建议。我正在努力了解做这件事的最佳方式。我不需要做任何事情,我只想将我的应用程序限制在某个主机名内。如果您觉得更舒服(没有黑客攻击),您可以看一看,我建议(出于许多其他原因)在node.js前面有一个反向代理。@hgoebl所以您需要指定您的节点应用程序来侦听localhost并将主机名代理到localhost:port?我真的不想代理任何东西,在我的请求中添加另一层。你是说我不能在node.js中指定主机名吗?不,我不是这么说的。但在许多情况下,将nginx放在前面有很多优势(SSL卸载、交付静态内容、在同一台机器或不同机器上的节点集群进行负载平衡、解决同源策略问题、高可用性)。我的评论只是一个建议而不是答案;-)我感谢你的建议。我正在努力了解做这件事的最佳方式。我不需要做任何事情,我只想把我的应用程序限制在某个主机名内。如果你觉得更舒服(不黑客),你可以看看,谢谢。我希望能够在node.js级别而不是在应用程序级别找到解决方案。最后我通过nginx使用了proxying。谢谢。我希望能够在node.js级别而不是在应用程序级别找到解决方案。最后,我通过nginx使用了proxying。感谢分享您的解决方案(不仅仅是文字),感谢分享您的解决方案(不仅仅是文字)