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

我希望允许经过身份validation的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 }); } 

然而,最大的问题是,当Web应用程序发出GET请求时,例如/js/lib.js ,它会parsing为http://myDomain/js/lib.js ,这是有问题的,因为express并不知道这些资产。 正确的请求将是http://myDomain/proxy/9000/js/lib.js 。 我如何路由所有这些额外的请求?

您需要做的是用新的URL模式replace初始页面中的URL。 发生什么事情是您的反向代理返回的初始页面有一个参考:
/js/lib.js或http://myDomain/js/lib.js
所以当浏览器发出第二个请求时,它的逆向代理模式是错误的。

根据传入的请求,您知道模式应该是什么样子。 在你的例子中是http://myDomain/proxy/9000 。 然后,您从http://127.0.0.1:9000/运行的其他服务器获取相应的页面。 你做一个stringreplace该文件中的任何资源。 你需要尝试一下这个模式,但是你可能会寻找'script src =“/'或'href =”/',你可能会发现正则expression式可以帮助模式,例如,如果src属性不是第一个列在脚本标签中。

例如,你可能会发现'scr ='/',然后你用src =“/ proxy / 9000 /'代替它,当浏览器请求本地资源时,它会通过你正在查找的端口。 这将需要实验,这是一个很好的algorithm来编写unit testing来完善。

一旦你完成了replace,你只需将该页面传输到客户端。 res.send()会为你做这个。

另外一些你可能会觉得有用的东西是,ExpressJS给你提供了一个方法来把你的端口号减less一点麻烦。 看看这个例子:

 app.get('/proxy/:port', function(req, res){ console.log('port is ' + req.params.port); }); 

我不认为http://myDomain/proxy/9000是正确的方法来做到这一点。 网页将假定该网站的域只是myDomain而不是myDomain/proxy/9000 ,因为这就是标准所说的。

通过使用像9000.proxy.myDomain这样的子域名可以更好地服务您的用例。