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
这样的子域名可以更好地服务您的用例。