节点https-proxy pathRewrite /路由器

时间:2018-07-02 06:40:26

标签: node.js http-proxy node-http-proxy node-https

我在端口30004000上运行同一节点应用程序的两个实例。 我希望有以下行为:

https://localhost/dev ==> http://localhost:3000 https://localhost/prod ==> http:// localhost:4000

我有以下代理服务器

var fs = require('fs'),
    httpProxy = require('http-proxy');

var PATH_TO_KEY = "/home/wow/browser.key",
    PATH_TO_CERT = "/home/wow/browser.crt",
    PATH_TO_CHAIN = "";

var options = {
  ssl: {
    key: fs.readFileSync(PATH_TO_KEY, 'utf8'),
    cert: fs.readFileSync(PATH_TO_CERT, 'utf8'),
    //ca : fs.readFileSync(PATH_TO_CHAIN, 'utf8')
  },

  target: "http://localhost:4000", // this is prod
  ws: true,
  xfwd: true,
  router: {
    'https://localhost/dev': 'http://127.0.0.1:3000/',
    'https://localhost/prod': 'http://127.0.0.1:4000/',
  },
  pathRewrite: {
    '^/dev' : '/',     // remove /dev/ path
    '^/prod' : '/'           // remove /prod/ path
  },
};
var server = httpProxy.createProxyServer(options).listen(443);

但是,当我访问https://localhost/devhttps://localhost/prod时,会发生以下情况:

  1. 它始终重定向到指定的target,而不重定向到router中指定的任何URL。
  2. 由于我总是以target/prodtarget/dev结尾,因此似乎没有发生pathRewrite。 / dev和/ prod的路径不存在,因此出现页面无法显示错误。

我不确定该怎么做。有人可以帮忙吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

“路由器”不是选项

'router'不仅不是http-proxy的文档功能,而且根本不是http-proxy的功能:

git clone https://github.com/nodejitsu/node-http-proxy.git
> Cloning into 'node-http-proxy'...
> remote: Counting objects: 5786, done.
> remote: Total 5786 (delta 0), reused 0 (delta 0), pack-reused 5785
> Receiving objects: 100% (5786/5786), 1.30 MiB | 6.06 MiB/s, done.
> Resolving deltas: 100% (2784/2784), done.
pushd node-http-proxy/
grep -r 'router' .
> # empty output

它也不是其任何依赖项的功能:

npm install
grep -r 'router' .
> # empty output again

通过与上述相同的检查方法,它也不是https-proxy的功能。

但是,还有其他一些选择:

问自己的问题:

1。您在节点中需要吗?

作为一个与节点有着深厚而持久的爱恨交加关系的人(我加入v0.2.x的日子,在核心中进行了一些提交),并且熟悉它的丑陋网络堆栈({{3 }},Goldilocks,Greenlock),并使用tls,http和net模块打开了Telebit,我可以告诉你这一点:

节点几乎肯定是错误的技术工具...但是根据您所针对的社区,它仍然可能是正确的选择

2。其他应用程序可以在节点中吗?

您需要转发到各个端口的目的是什么?您能合理地将那些应用程序编写为主应用程序的插件吗?还是您支持任意应用程序?