我在将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();
}
});
这看起来像是一个黑客,虽然我还没有找到更好的方法来做到这一点。任何建议或指示将不胜感激。
答案 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主机名的唯一方法。