我想允许 Express 中经过身份验证的客户端访问在服务器上运行但在不同端口上的其他 Web 应用程序。
例如,我在 http://myDomain
上运行 express,并且我有另一个应用程序在端口 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
,这是有问题的,因为 express 不知道这些 Assets 。正确的请求应该是 http://myDomain/proxy/9000/js/lib.js
。我如何路由所有这些额外的请求?
最佳答案
您需要做的是用新的 URL 模式替换初始页面中的 URL。发生的情况是您的反向代理返回的初始页面引用了:
/js/lib.js 或 http://myDomain/js/lib.js
所以当浏览器发出第二个请求时,它的反向代理模式是错误的。
根据传入的请求,您知道模式应该是什么样子。在您的示例中,它是 http://myDomain/proxy/9000
。然后,您从运行在 http://127.0.0.1:9000/
上的另一台服务器获取适当的页面。您对该文件中的任何资源执行字符串替换。您需要尝试使用该模式,但您可能会寻找“script src="/”或“href="/”,并且您可能会发现正则表达式对模式有帮助,例如,如果 src 属性不是第一个列在脚本标签中。
例如,您可能会找到 'scr="/' 然后将其替换为 'src="/proxy/9000/' 这样,当浏览器请求该本地资源时,它将通过您指定的端口正在寻找。这将需要进行实验,这是一个很好的算法,可以围绕它编写单元测试以获得完美。
完成替换后,您只需将该页面流式传输到客户端即可。 res.send() 会为你做这件事。
您可能会发现有用的其他东西是 ExpressJS 为您提供了一种提取端口号的方法,比您现在做的麻烦少一些。看看这个例子:
app.get('/proxy/:port', function(req, res){
console.log('port is ' + req.params.port);
});
关于javascript - express .js : reverse proxying different web app along with assets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22244651/