我想做一个简单的node.js反向代理,在同一个端口80上托管多个Node.JS应用程序以及我的apache服务器。所以我找到了这个例子here
var http = require('http')
, httpProxy = require('http-proxy');
httpProxy.createServer({
hostnameOnly: true,
router: {
'www.my-domain.com': '127.0.0.1:3001',
'www.my-other-domain.de' : '127.0.0.1:3002'
}
}).listen(80);
问题是我希望例如app1.my-domain.com指向localhost:3001,app2.my-domain.com指向localhost:3002,所有其他指向port 3000例如,其中我的apache服务器将运行。我在文档中找不到有关如何使用“默认”路线的任何内容。
有什么想法吗?
编辑我想这样做,因为我的apache服务器处理了很多域/子域名,我不希望每次要添加时都要修改此路由表一个新的子域名。
答案 0 :(得分:10)
近一年来,我成功地使用了已接受的答案来拥有一个默认主机,但是现在node-http-proxy允许在主机表中使用RegEx,这是一种更简单的方法。
var httpProxy = require('http-proxy');
var options = {
// this list is processed from top to bottom, so '.*' will go to
// '127.0.0.1:3000' if the Host header hasn't previously matched
router : {
'example.com': '127.0.0.1:3001',
'sample.com': '127.0.0.1:3002',
'^.*\.sample\.com': '127.0.0.1:3002',
'.*': '127.0.0.1:3000'
}
};
// bind to port 80 on the specified IP address
httpProxy.createServer(options).listen(80, '12.23.34.45');
要求您没有将hostnameOnly
设置为true,否则将不会处理RegEx。
答案 1 :(得分:3)
这没有融入node-http-proxy,但编码很简单:
var httpProxy = require('http-proxy'),
http = require('http'),
addresses;
// routing hash
addresses = {
'localhost:8000': {
host: 'localhost',
port: 8081
},
'local.dev:8000': {
host: 'localhost',
port: 8082
},
'default': {
host: 'xkcd.com',
port: 80
}
};
// create servers on localhost on ports specified by param
function createLocalServer(ports) {
ports.forEach(function(port) {
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('<h1>Hello from ' + port + '</h1');
}).listen(port);
});
console.log('Servers up on ports ' + ports.join(',') + '.');
}
createLocalServer([8081, 8082]);
console.log('======================================\nRouting table:\n---');
Object.keys(addresses).forEach(function(from) {
console.log(from + ' ==> ' + addresses[from].host + ':' + addresses[from].port);
});
httpProxy.createServer(function (req, res, proxy) {
var target;
// if the host is defined in the routing hash proxy to it
// else proxy to default host
target = (addresses[req.headers.host]) ? addresses[req.headers.host] : addresses.default;
proxy.proxyRequest(req, res, target);
}).listen(8000);
如果您在端口8000上访问localhost,它将代理到localhost端口8081。
如果您在端口8000上访问127.0.0.1(未在我们的路由哈希中定义),它将转到默认的“位置”,即端口80上的xkcd.com。