2

特定のポートのリクエストを取得し、それを別のポートの新しいサーバーにプロキシするアプリケーションを作成する必要があります

たとえば、次のポート 3000 はポート 9000 へのプロキシになり、クライアントのユーザーが 3000 をクリックするため、実際には 9000 でアプリケーションを実行します (ボンネットの下)。

http://localhost:3000/a/b/c

http://localhost:9000/a/b/c

私は次のようなことを試します

var proxy = httpProxy.createProxyServer({});

            http.createServer(function (req, res) {

                var hostname = req.headers.host.split(":")[0];
                var pathname = url.parse(req.url).pathname;
                proxy.web(req, res, {
                        target: 'http://' + hostname + ':' + 9000
                    });
     var proxyServer = http.createServer(function (req, res) {

                    res.end("Request received on " + 9000);
                });
                proxyServer.listen(9000);

            }).listen(3000, function () {

     });
  1. それを行う正しい方法はありますか?
  2. どうすればテストできますか? ポート 3000 でノード アプリケーションを実行すると、このポートが既に使用されているため、最初の URL をクライアントhttp://localhost:3000/a/b/cに入れることができないため、質問します。回避策はありますか?
4

1 に答える 1

2

プロキシ サーバーのさまざまな使用法に関するはほとんどありません。基本的なプロキシ サーバーの簡単な例を次に示します。

var http = require("http");
var httpProxy = require('http-proxy');

/** PROXY SERVER **/
var proxy = httpProxy.createServer({
  target:'http://localhost:'+3000,
  changeOrigin: true
})

// add custom header by the proxy server
proxy.on('proxyReq', function(proxyReq, req, res, options) {
  proxyReq.setHeader('X-Special-Proxy-Header', 'foobar');
});

proxy.listen(8080);

/** TARGET HTTP SERVER **/
http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });

  //check if the request came from proxy server
  if(req.headers['x-special-proxy-header'])
    console.log('Request received from proxy server.')

  res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
  res.end();
}).listen(3000);

プロキシ サーバーが動作しているかどうか、またはリクエストがプロキシ サーバーから送信されているかどうかをテストするには:

proxyReqカスタム ヘッダーを追加するリスナーを追加しました。要求がプロキシ サーバーからのものかどうかは、このヘッダーからわかります。

したがって、アクセスすると、次のようなヘッダーがあるhttp://localhost:8080/a/b/cことがわかります。req.headers

'X-Special-Proxy-Header': 'foobar'

このヘッダーは、クライアントが 8080 ポートに要求を行う場合にのみ設定されます

ただし、http://localhost:3000/a/b/cクライアントがプロキシ サーバーをバイパスしており、そのヘッダーが設定されていないため、このようなヘッダーは表示されません。

于 2015-07-06T23:30:58.473 に答える