我希望允许Express中经过身份验证的客户端访问服务器上运行但位于不同端口的其他Web应用程序。
例如,我已经快速运行http://myDomain
并且我在另一个应用程序上运行了端口9000
。我希望能够通过http://myDomain/proxy/9000
到达其他应用。
我使用node-http-proxy取得了一些成功,例如:
function(req, res) {
var stripped = req.url.split('/proxy')[1];
var path = stripped.split('/');
var port = path.shift();
var url = path.join('/');
req.url = url;
proxy.web(req, res, {
target: 'http://127.0.0.1:' + port
});
}
然而,最大的问题是当网络应用发出GET请求时,例如/js/lib.js
,它会解析为http://myDomain/js/lib.js
,这是有问题的,因为快递不知道这些资产。正确的请求是http://myDomain/proxy/9000/js/lib.js
。如何路由所有这些额外请求?
答案 0 :(得分:1)
我认为http://myDomain/proxy/9000
是正确的做法。网页将假定网站的网址只是myDomain
而不是myDomain/proxy/9000
,因为这就是标准所说的。
使用9000.proxy.myDomain
等子域名可以更好地满足您的使用情况。
答案 1 :(得分:1)
您需要做的是使用新的网址格式替换初始网页中的网址。发生的事情是您的反向代理返回的初始页面引用了:
/js/lib.js或http://myDomain/js/lib.js
所以当浏览器发出第二个请求时,它的反向代理模式就是错误的。
根据传入的请求,您知道模式应该是什么样子。在您的示例中,它是http://myDomain/proxy/9000
。然后,从http://127.0.0.1:9000/
上运行的其他服务器获取相应的页面。您对该文件中的任何资源执行字符串替换。您需要尝试使用该模式,但您可能会寻找脚本src =" /'或' href =" /'例如,如果src属性不是脚本标记中列出的第一个属性,那么您可能会发现正则表达式有助于模式。
例如,您可能会发现' scr =" /'然后用'src =" / proxy / 9000 /'替换它。这样当浏览器请求该本地资源时,它将通过您正在寻找的端口来实现。这需要进行实验,并且它是编写单元测试以获得完美的一种很好的算法。
完成替换后,您只需将该页面流式传输到客户端即可。 res.send()会为你做这件事。
你可能会觉得有用的其他东西是ExpressJS为你提供了一种方法来拉出端口号,而不是你做的那么麻烦。看一下这个例子:
app.get('/proxy/:port', function(req, res){
console.log('port is ' + req.params.port);
});