Express.js:反向代理不同的Web应用程序以及资产

时间:2014-03-07 08:01:28

标签: javascript node.js express proxy node-http-proxy

我希望允许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。如何路由所有这些额外请求?

2 个答案:

答案 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);
});