1

私たちのラボには、テスト/開発作業用の単純な nodejs プロセスがあります。node-proxyを使用してリバース プロキシをセットアップし、http を使用して https サーバーと通信できるようにします (つまり、http -> https)。その一環として、応答を変更するためのコードがいくつかあります。これが私たちがやっていることです:

var http = require('http'),
    httpProxy = require('http-proxy'), 
    endserver = 'server.local',
    endport = 8443;

var proxy = new httpProxy.HttpProxy({ 
  target: {
    https: true,
    host: endserver,
    port: endport
  } 
});

http.createServer(function (req, res) {
  //our code for modifying response is here...
  proxy.proxyRequest(req, res);
}).listen(8001);

この例のように、ノード プロキシ ルーティング テーブルを設定したいので、リクエストのホスト名に応じて異なるhttpsサーバーにリクエストを転送できます (実行中の同じサーバーを指す DNS に複数のホスト名を設定します)。 nodejs プロキシ)。

ノード プロキシ ルーティング テーブルを作成して応答を変更するにはどうすればよいですか?

(私はnode.jsは初めてですが、javascriptは初めてです)

4

1 に答える 1

2

あなたの質問を正しく読んだ場合、ノード プロキシ ルーティング テーブルを使用して、リクエスト オブジェクトに基づいてさまざまなホストへのリクエストをルーティングする方法を知っている必要があります。これは実際には node-http-proxy docs で対処されています: Proxy requests using a ProxyTable

それを貼り付けて、次のように JS オブジェクトでパスを構成するだけです。

var options = {
  router: {
    'foo.com/baz': '127.0.0.1:8001',
    'foo.com/buz': '127.0.0.1:8002',
    'bar.com/buz': '127.0.0.1:8003'
  }
};

次に、プロキシ サーバーを作成するときにこのオブジェクトを渡します。

var proxyServer = httpProxy.createServer(options);
proxyServer.listen(80);

これをコードに指定すると、次のようになります。

var http = require('http'),
    httpProxy = require('http-proxy'), 
    endserver = 'server.local',
    endport = 8443;

var options = {
  router: {
    endserver + '/foo': '127.0.0.1:8081',
    endserver + '/bar': '127.0.0.1:8082',
    endserver + '/baz': '127.0.0.1:8083'
  }
};

var proxyServer = httpProxy.createServer(options);
proxyServer.listen(endport);

http.createServer(function (req, res) {
  // your code for modifying response is here...
  proxy.proxyRequest(req, res);
}).listen(8001);

ルーターオプションを使用する場合、ターゲットを自分で設定する必要はありません。httpsの区別も扱っているようですが、よくわかりません。この情報はproxy-table.js sourceから取得しました。特に:

ProxyTable.prototype.setRoutes = function (router) {
  if (!router) {
    throw new Error('Cannot update ProxyTable routes without router.');
  }

  var self = this;
  this.router = router;

  if (this.hostnameOnly === false) {
    this.routes = [];

    Object.keys(router).forEach(function (path) {
      if (!/http[s]?/.test(router[path])) {
        router[path] = (self.target.https ? 'https://' : 'http://')
          + router[path];
      }

      var target = url.parse(router[path]),
          defaultPort = self.target.https ? 443 : 80;

      //
      // Setup a robust lookup table for the route:
      //
      // {
      // source: {
      // regexp: /^foo.com/i,
      // sref: 'foo.com',
      // url: {
      // protocol: 'http:',
      // slashes: true,
      // host: 'foo.com',
      // hostname: 'foo.com',
      // href: 'http://foo.com/',
      // pathname: '/',
      // path: '/'
      // }
      // },
      // {
      // target: {
      // sref: '127.0.0.1:8000/',
      // url: {
      // protocol: 'http:',
      // slashes: true,
      // host: '127.0.0.1:8000',
      // hostname: '127.0.0.1',
      // href: 'http://127.0.0.1:8000/',
      // pathname: '/',
      // path: '/'
      // }
      // },
      //
      self.routes.push({
        source: {
          regexp: new RegExp('^' + path, 'i'),
          sref: path,
          url: url.parse('http://' + path)
        },
        target: {
          sref: target.hostname + ':' + (target.port || defaultPort) + target.path,
          url: target
        }
      });
    });
  }
};
于 2013-12-26T22:57:31.417 に答える