node-http-proxy
WebSocket をサポートする HTTP プログラム可能なプロキシ ライブラリです。リバース プロキシやロード バランサなどのコンポーネントの実装に適しています。
npm install http-proxy --save
トップに戻る
ここをクリック
トップに戻る
新しいプロキシは、 createProxyServer
を呼び出し、引数としてoptions
オブジェクトを渡すことによって作成されます (有効なプロパティはここで利用可能です)。
var httpProxy = require ( 'http-proxy' ) ;
var proxy = httpProxy . createProxyServer ( options ) ; // See (†)
†オブジェクトに対して listen(..) が呼び出されない限り、Web サーバーは作成されません。以下を参照してください。
オブジェクトは 4 つのメソッドで返されます。
req, res, [options]
(通常の HTTP(S) リクエストのプロキシに使用されます)req, socket, head, [options]
(WS(S) リクエストのプロキシに使用されます)port
(便宜上、オブジェクトを Web サーバーにラップする関数)[callback]
(内部 Web サーバーを閉じ、指定されたポートでの待機を停止する関数)これらの関数を呼び出すことでリクエストをプロキシすることができます。
http . createServer ( function ( req , res ) {
proxy . web ( req , res , { target : 'http://mytarget.com:8080' } ) ;
} ) ;
エラーはイベント エミッター API を使用してリッスンできます。
proxy . on ( 'error' , function ( e ) {
...
} ) ;
またはコールバック API を使用する
proxy . web ( req , res , { target : 'http://mytarget.com:8080' } , function ( e ) { ... } ) ;
リクエストがプロキシされると、 req
オブジェクトとres
オブジェクトの両方に変換を適用する 2 つの異なるパイプライン (ここで利用可能) に従います。最初のパイプライン (受信) は、クライアントをターゲットに接続するストリームの作成と操作を担当します。 2 番目のパイプライン (送信) は、ターゲットからクライアントにデータを返すストリームの作成と操作を担当します。
トップに戻る
var http = require ( 'http' ) ,
httpProxy = require ( 'http-proxy' ) ;
//
// Create your proxy server and set the target in the options.
//
httpProxy . createProxyServer ( { target : 'http://localhost:9000' } ) . listen ( 8000 ) ; // See (†)
//
// Create your target server
//
http . createServer ( function ( req , res ) {
res . writeHead ( 200 , { 'Content-Type' : 'text/plain' } ) ;
res . write ( 'request successfully proxied!' + 'n' + JSON . stringify ( req . headers , true , 2 ) ) ;
res . end ( ) ;
} ) . listen ( 9000 ) ;
†listen(..) を呼び出すと、Web サーバーの作成がトリガーされます。それ以外の場合は、プロキシ インスタンスのみが作成されます。
トップに戻る
この例では、独自の HTTP サーバーを使用してリクエストをプロキシする方法と、リクエストを処理する独自のロジックを配置する方法を示します。
var http = require ( 'http' ) ,
httpProxy = require ( 'http-proxy' ) ;
//
// Create a proxy server with custom application logic
//
var proxy = httpProxy . createProxyServer ( { } ) ;
//
// Create your custom server and just call `proxy.web()` to proxy
// a web request to the target passed in the options
// also you can use `proxy.ws()` to proxy a websockets request
//
var server = http . createServer ( function ( req , res ) {
// You can define here your custom logic to handle the request
// and then proxy the request.
proxy . web ( req , res , { target : 'http://127.0.0.1:5050' } ) ;
} ) ;
console . log ( "listening on port 5050" )
server . listen ( 5050 ) ;
トップに戻る
この例では、独自の HTTP サーバーを使用してリクエストをプロキシし、特別なヘッダーを追加して発信プロキシ リクエストを変更する方法を示します。
var http = require ( 'http' ) ,
httpProxy = require ( 'http-proxy' ) ;
//
// Create a proxy server with custom application logic
//
var proxy = httpProxy . createProxyServer ( { } ) ;
// To modify the proxy connection before data is sent, you can listen
// for the 'proxyReq' event. When the event is fired, you will receive
// the following arguments:
// (http.ClientRequest proxyReq, http.IncomingMessage req,
// http.ServerResponse res, Object options). This mechanism is useful when
// you need to modify the proxy request before the proxy connection
// is made to the target.
//
proxy . on ( 'proxyReq' , function ( proxyReq , req , res , options ) {
proxyReq . setHeader ( 'X-Special-Proxy-Header' , 'foobar' ) ;
} ) ;
var server = http . createServer ( function ( req , res ) {
// You can define here your custom logic to handle the request
// and then proxy the request.
proxy . web ( req , res , {
target : 'http://127.0.0.1:5050'
} ) ;
} ) ;
console . log ( "listening on port 5050" )
server . listen ( 5050 ) ;
トップに戻る
元のサーバーから HTML/XML ドキュメントを受信したときに、転送する前に変更したい場合があります。
Harmon を使用すると、プロキシへの負担を最小限に抑えるために、これをストリーミング スタイルで行うことができます。
トップに戻る
var http = require ( 'http' ) ,
httpProxy = require ( 'http-proxy' ) ;
//
// Create a proxy server with latency
//
var proxy = httpProxy . createProxyServer ( ) ;
//
// Create your server that makes an operation that waits a while
// and then proxies the request
//
http . createServer ( function ( req , res ) {
// This simulates an operation that takes 500ms to execute
setTimeout ( function ( ) {
proxy . web ( req , res , {
target : 'http://localhost:9008'
} ) ;
} , 500 ) ;
} ) . listen ( 8008 ) ;
//
// Create your target server
//
http . createServer ( function ( req , res ) {
res . writeHead ( 200 , { 'Content-Type' : 'text/plain' } ) ;
res . write ( 'request successfully proxied to: ' + req . url + 'n' + JSON . stringify ( req . headers , true , 2 ) ) ;
res . end ( ) ;
} ) . listen ( 9008 ) ;
トップに戻る
オプションでsecure: true
を設定するだけで、ターゲット接続に対する安全な SSL 証明書の検証をアクティブ化できます (自己署名証明書を回避します)。
//
// Create the HTTPS proxy server in front of a HTTP server
//
httpProxy . createServer ( {
target : {
host : 'localhost' ,
port : 9009
} ,
ssl : {
key : fs . readFileSync ( 'valid-ssl-key.pem' , 'utf8' ) ,
cert : fs . readFileSync ( 'valid-ssl-cert.pem' , 'utf8' )
}
} ) . listen ( 8009 ) ;
//
// Create the proxy server listening on port 443
//
httpProxy . createServer ( {
ssl : {
key : fs . readFileSync ( 'valid-ssl-key.pem' , 'utf8' ) ,
cert : fs . readFileSync ( 'valid-ssl-cert.pem' , 'utf8' )
} ,
target : 'https://localhost:9010' ,
secure : true // Depends on your needs, could be false.
} ) . listen ( 443 ) ;
//
// Create an HTTP proxy server with an HTTPS target
//
httpProxy . createProxyServer ( {
target : {
protocol : 'https:' ,
host : 'my-domain-name' ,
port : 443 ,
pfx : fs . readFileSync ( 'path/to/certificate.p12' ) ,
passphrase : 'password' ,
} ,
changeOrigin : true ,
} ) . listen ( 8000 ) ;
トップに戻る
オプションでws:true
使用して、プロキシの WebSocket サポートをアクティブ化できます。
//
// Create a proxy server for websockets
//
httpProxy . createServer ( {
target : 'ws://localhost:9014' ,
ws : true
} ) . listen ( 8014 ) ;
また、 ws(req, socket, head)
メソッドを呼び出すだけでWebSocketリクエストをプロキシすることもできます。
//
// Setup our server to proxy standard HTTP requests
//
var proxy = new httpProxy . createProxyServer ( {
target : {
host : 'localhost' ,
port : 9015
}
} ) ;
var proxyServer = http . createServer ( function ( req , res ) {
proxy . web ( req , res ) ;
} ) ;
//
// Listen to the `upgrade` event and proxy the
// WebSocket requests as well.
//
proxyServer . on ( 'upgrade' , function ( req , socket , head ) {
proxy . ws ( req , socket , head ) ;
} ) ;
proxyServer . listen ( 8015 ) ;
トップに戻る
httpProxy.createProxyServer
次のオプションをサポートしています。
target : URL モジュールで解析される URL 文字列
forward : URL モジュールで解析される URL 文字列
Agent : http(s).request に渡されるオブジェクト (ノードの https エージェント オブジェクトと http エージェント オブジェクトを参照)
ssl : https.createServer() に渡されるオブジェクト
ws : true/false、WebSocket をプロキシする場合
xfwd : true/false、x-forward ヘッダーを追加します
secure : true/false、SSL証明書を検証する場合
toProxy : true/false、絶対 URL をpath
として渡します (プロキシへのプロキシに役立ちます)
prependPath : true/false、デフォルト: true - ターゲットのパスをプロキシ パスの先頭に追加するかどうかを指定します。
ignorePath : true/false、デフォルト: false - 受信リクエストのプロキシ パスを無視するかどうかを指定します (注: 必要に応じて / を手動で追加する必要があります)。
localAddress : 発信接続用にバインドするローカル インターフェイス文字列
changeOrigin : true/false、デフォルト: false - ホストヘッダーのオリジンをターゲット URL に変更します。
prepareHeaderKeyCase : true/false、デフォルト: false - 応答ヘッダー キーの大文字と小文字を保持するかどうかを指定します。
auth : 基本認証、つまり Authorization ヘッダーを計算するための「user:password」。
hostRewrite : (201/301/302/307/308) リダイレクト上の場所のホスト名を書き換えます。
autoRewrite : 要求されたホスト/ポートに基づいて、(201/301/302/307/308) リダイレクト上のホスト/ポートの場所を書き換えます。デフォルト: false。
protocolRewrite : (201/301/302/307/308) リダイレクト上の位置プロトコルを「http」または「https」に書き換えます。デフォルト: null。
cookieDomainRewrite : set-cookie
ヘッダーのドメインを書き換えます。可能な値:
false
(デフォルト): Cookie の書き換えを無効にします。cookieDomainRewrite: "new.domain"
。ドメインを削除するには、 cookieDomainRewrite: ""
を使用します。"*"
を使用します。たとえば、1 つのドメインを変更せずに維持し、1 つのドメインを書き換えて、他のドメインを削除します。 cookieDomainRewrite: {
"unchanged.domain": "unchanged.domain",
"old.domain": "new.domain",
"*": ""
}
cookiePathRewrite : set-cookie
ヘッダーのパスを書き換えます。可能な値:
false
(デフォルト): Cookie の書き換えを無効にします。cookiePathRewrite: "/newPath/"
。パスを削除するには、 cookiePathRewrite: ""
を使用します。ルートへのパスを設定するには、 cookiePathRewrite: "/"
を使用します。"*"
を使用します。たとえば、1 つのパスを変更しないようにするには、1 つのパスを書き換えて、他のパスを削除します。 cookiePathRewrite: {
"/unchanged.path/": "/unchanged.path/",
"/old.path/": "/new.path/",
"*": ""
}
headers : ターゲットリクエストに追加される追加のヘッダーを含むオブジェクト。
proxyTimeout : 送信プロキシ要求のタイムアウト (ミリ単位)
timeout : 受信リクエストのタイムアウト (ミリ単位)
followRedirects : true/false、デフォルト: false - リダイレクトを追跡するかどうかを指定します。
selfHandleResponse true/false。true に設定すると、webOutcoming パスはいずれも呼び出されず、 proxyRes
イベントをリッスンして処理することで応答を適切に返すのはユーザーの責任です。
buffer : リクエスト本体として送信するデータのストリーム。おそらく、プロキシする前にリクエストストリームを消費するミドルウェアがあるかもしれません。たとえば、リクエストの本文を「req.rawbody」というフィールドに読み込んだ場合、バッファオプションでこのフィールドを再ストリーミングできます。
'use strict';
const streamify = require('stream-array');
const HttpProxy = require('http-proxy');
const proxy = new HttpProxy();
module.exports = (req, res, next) => {
proxy.web(req, res, {
target: 'http://localhost:4003/',
buffer: streamify(req.rawBody)
}, next);
};
注: options.ws
とoptions.ssl
はオプションです。 options.target
とoptions.forward
両方を欠落させることはできません
proxyServer.listen
メソッドを使用している場合は、次のオプションも適用できます。
トップに戻る
error
: ターゲットへのリクエストが失敗した場合、エラー イベントが生成されます。クライアントとプロキシの間で渡されるメッセージ、およびプロキシとターゲットの間で渡されるメッセージのエラー処理は行わないため、エラーをリッスンして処理することをお勧めします。proxyReq
: このイベントは、データが送信される前に発行されます。これにより、proxyReq リクエスト オブジェクトを変更する機会が得られます。 「Web」接続に適用されますproxyReqWs
: このイベントは、データが送信される前に発行されます。これにより、proxyReq リクエスト オブジェクトを変更する機会が得られます。 「WebSocket」接続に適用されますproxyRes
: このイベントは、ターゲットへのリクエストが応答を受け取った場合に発行されます。open
: このイベントは、プロキシ WebSocket が作成され、ターゲット WebSocket にパイプされると発行されます。close
: このイベントは、プロキシ WebSocket が閉じられると発行されます。proxySocket
: open
優先して非推奨になりました。 var httpProxy = require ( 'http-proxy' ) ;
// Error example
//
// Http Proxy Server with bad target
//
var proxy = httpProxy . createServer ( {
target : 'http://localhost:9005'
} ) ;
proxy . listen ( 8005 ) ;
//
// Listen for the `error` event on `proxy`.
proxy . on ( 'error' , function ( err , req , res ) {
res . writeHead ( 500 , {
'Content-Type' : 'text/plain'
} ) ;
res . end ( 'Something went wrong. And we are reporting a custom error message.' ) ;
} ) ;
//
// Listen for the `proxyRes` event on `proxy`.
//
proxy . on ( 'proxyRes' , function ( proxyRes , req , res ) {
console . log ( 'RAW Response from the target' , JSON . stringify ( proxyRes . headers , true , 2 ) ) ;
} ) ;
//
// Listen for the `open` event on `proxy`.
//
proxy . on ( 'open' , function ( proxySocket ) {
// listen for messages coming FROM the target here
proxySocket . on ( 'data' , hybiParseAndLogMessage ) ;
} ) ;
//
// Listen for the `close` event on `proxy`.
//
proxy . on ( 'close' , function ( res , socket , head ) {
// view disconnected websocket connections
console . log ( 'Client disconnected' ) ;
} ) ;
トップに戻る
var proxy = new httpProxy . createProxyServer ( {
target : {
host : 'localhost' ,
port : 1337
}
} ) ;
proxy . close ( ) ;
トップに戻る
proxyRes
受信した後に独自の応答を処理したい場合は、 selfHandleResponse
を使用して行うことができます。以下でわかるように、このオプションを使用すると、 proxyRes
インターセプトして読み取ることができますが、 res
自体に必ず返信する必要があります。そうしないと、元のクライアントはデータを受信できなくなります。
var option = {
target : target ,
selfHandleResponse : true
} ;
proxy . on ( 'proxyRes' , function ( proxyRes , req , res ) {
var body = [ ] ;
proxyRes . on ( 'data' , function ( chunk ) {
body . push ( chunk ) ;
} ) ;
proxyRes . on ( 'end' , function ( ) {
body = Buffer . concat ( body ) . toString ( ) ;
console . log ( "res from proxied server:" , body ) ;
res . end ( "my response to cli" ) ;
} ) ;
} ) ;
proxy . web ( req , res , option ) ;
プロキシ テーブル API は、このアドオン モジュールを通じて利用できます。これにより、一致するルートをリバース プロキシが通信するターゲット ルートに変換する一連のルールを定義できます。
$ npm test
ディエゴ・パスクアリが作成したロゴ
トップに戻る
master
とは異なるブランチである必要があります)トップに戻る
MIT ライセンス (MIT)
著作権 (c) 2010 - 2016 チャーリー・ロビンス、ジャレット・クルーガーおよび貢献者。
本ソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) のコピーを入手した人には、使用、コピー、変更、マージする権利を含むがこれらに限定されない、制限なくソフトウェアを取り扱う許可が、ここに無償で与えられます。 、以下の条件を条件として、本ソフトウェアのコピーを出版、配布、サブライセンス、および/または販売すること、および本ソフトウェアが提供される人物にそれを許可すること。
上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは主要部分に含まれるものとします。
ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、いかなる種類の保証も行われません。いかなる場合においても、作者または著作権所有者は、契約行為、不法行為、またはその他の行為であるかどうかにかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因または関連して生じる、いかなる請求、損害、またはその他の責任に対しても責任を負わないものとします。ソフトウェア。