【发布时间】: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-host和stackoverflow.com/questions/8503841