使用Express代理,如何更改相对URL?

时间:2016-02-02 14:17:05

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

为了避免客户端javascript代码的典型CORS问题,我使用了nodejs express服务器。该服务器包含以下代码:

var app = express();

  app.all('/Api/*', function (req, res) {
    proxy.web(req, res, {
        target: 'https://www.myserver.com',
        changeOrigin:true
    });
  });

这样做的目的是将以/Api开头的任何调用重定向到我的服务器。

但是,这也会将Api添加到网址路径,因此Api/getData变为https://www.myserver.com/Api/getData

有没有办法剥离相对网址的Api部分?最终结果是Api/getData成为https://www.myserver.com/getData

这将允许我通过更改相对URL路径的第一部分来定位多个服务器。像这样:

Api/getData - > https://www.myserver.com/getData

OtherApi/getData/for/some/path - > https://www.some-other-server.com/getData/for/some/path

这当然适用于所有请求类型,不仅适用于GET

谢谢!

2 个答案:

答案 0 :(得分:2)

查看http-proxy-rules模块,它是node-http-proxy的配套模块。它允许您编写规则以更改到不同代理路由的匹配路由。

有了它,你应该可以像这样定义你的翻译:

var proxyRules = new HttpProxyRules({
    rules: {
      '.*/Api': 'http://myserver.com/', // Rule (1)
      '.*/OtherApi*': 'http://some-other-server.com:8080/' // Rule (2)
    },
    default: 'http://myserver.com/' // default target
  });

然后像这样使用它们:

app.all('*', function(req, res) {
  var target = proxyRules.match(req);
  if (target) {
    return proxy.web(req, res, {
      target: target
    });
  }
})

答案 1 :(得分:0)

您可以尝试修改req.url选项。类似的东西:

app.all('/Api/*', function (req, res) {        
    req.url = req.url.split('/Api/')[1];
    proxy.web(req, res, {
        target: 'http://stackoverflow.com/',
        changeOrigin:true
    });
});