1

我想允许 Express 中经过身份验证的客户端访问在服务器上运行但在不同端口上的其他 Web 应用程序。

例如,我有 express 运行,http://myDomain并且我有另一个应用程序运行在说 port 上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 请求时,例如 for /js/lib.js,它会解析为http://myDomain/js/lib.js,这是有问题的,因为 express 不知道这些资产。正确的要求是http://myDomain/proxy/9000/js/lib.js. 我如何路由所有这些额外的请求?

4

2 回答 2

1

我认为这不是http://myDomain/proxy/9000正确的方法。网页将假定站点的域是 justmyDomain和 not myDomain/proxy/9000,因为这是标准所说的。

使用子域(如9000.proxy.myDomain.

于 2014-03-14T19:36:46.407 回答
1

您需要做的是将初始页面中的 URL 替换为新的 URL 模式。正在发生的事情是,您的反向代理返回的初始页面有一个引用:
/js/lib.jshttp://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);
});
于 2014-03-18T04:29:11.350 回答