node-http-proxy
adalah pustaka proksi HTTP yang dapat diprogram yang mendukung soket web. Sangat cocok untuk mengimplementasikan komponen seperti proxy terbalik dan penyeimbang beban.
npm install http-proxy --save
Kembali ke atas
klik disini
Kembali ke atas
Proksi baru dibuat dengan memanggil createProxyServer
dan meneruskan objek options
sebagai argumen (properti yang valid tersedia di sini)
var httpProxy = require ( 'http-proxy' ) ;
var proxy = httpProxy . createProxyServer ( options ) ; // See (†)
†Kecuali mendengarkan(..) dipanggil pada objek, ini tidak membuat server web. Lihat di bawah.
Sebuah objek akan dikembalikan dengan empat metode:
req, res, [options]
(digunakan untuk mem-proxy permintaan HTTP(S) reguler)req, socket, head, [options]
(digunakan untuk mem-proxy permintaan WS(S))port
(fungsi yang membungkus objek di server web, untuk kenyamanan Anda)[callback]
(fungsi yang menutup server web bagian dalam dan berhenti mendengarkan pada port tertentu)Permintaan proksi kemudian dapat dilakukan dengan memanggil fungsi-fungsi ini
http . createServer ( function ( req , res ) {
proxy . web ( req , res , { target : 'http://mytarget.com:8080' } ) ;
} ) ;
Kesalahan dapat dideteksi menggunakan API Event Emitter
proxy . on ( 'error' , function ( e ) {
...
} ) ;
atau menggunakan API panggilan balik
proxy . web ( req , res , { target : 'http://mytarget.com:8080' } , function ( e ) { ... } ) ;
Saat permintaan diproksi, permintaan tersebut mengikuti dua alur berbeda (tersedia di sini) yang menerapkan transformasi ke objek req
dan res
. Saluran pipa pertama (masuk) bertanggung jawab atas pembuatan dan manipulasi aliran yang menghubungkan klien Anda ke target. Pipeline kedua (keluar) bertanggung jawab atas pembuatan dan manipulasi aliran yang, dari target Anda, mengembalikan data ke klien.
Kembali ke atas
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 ) ;
†Meminta mendengarkan(..) memicu pembuatan server web. Jika tidak, hanya contoh proksi yang dibuat.
Kembali ke atas
Contoh ini menunjukkan bagaimana Anda dapat memproksi permintaan menggunakan server HTTP Anda sendiri dan Anda juga dapat menggunakan logika Anda sendiri untuk menangani permintaan tersebut.
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 ) ;
Kembali ke atas
Contoh ini menunjukkan bagaimana Anda dapat memproksi permintaan menggunakan server HTTP Anda sendiri yang mengubah permintaan proksi keluar dengan menambahkan header khusus.
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 ) ;
Kembali ke atas
Terkadang ketika Anda telah menerima dokumen HTML/XML dari server asal Anda ingin memodifikasinya sebelum meneruskannya.
Harmon memungkinkan Anda melakukan ini dalam gaya streaming untuk meminimalkan tekanan pada proxy.
Kembali ke atas
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 ) ;
Kembali ke atas
Anda dapat mengaktifkan validasi sertifikat SSL aman ke koneksi target (hindari sertifikat yang ditandatangani sendiri), cukup atur secure: true
di opsi.
//
// 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 ) ;
Kembali ke atas
Anda dapat mengaktifkan dukungan websocket untuk proxy menggunakan ws:true
di opsi.
//
// Create a proxy server for websockets
//
httpProxy . createServer ( {
target : 'ws://localhost:9014' ,
ws : true
} ) . listen ( 8014 ) ;
Anda juga dapat mem-proxy permintaan websocket hanya dengan memanggil metode ws(req, socket, head)
.
//
// 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 ) ;
Kembali ke atas
httpProxy.createProxyServer
mendukung opsi berikut:
target : string url yang akan diurai dengan modul url
forward : string url yang akan diurai dengan modul url
agent : objek yang akan diteruskan ke http(s).request (lihat objek agen https dan agen http Node)
ssl : objek yang akan diteruskan ke https.createServer()
ws : benar/salah, jika Anda ingin membuat proxy websockets
xfwd : benar/salah, menambahkan header x-forward
aman : benar/salah, jika Anda ingin memverifikasi Sertifikat SSL
toProxy : benar/salah, meneruskan URL absolut sebagai path
(berguna untuk melakukan proxy ke proxy)
prependPath : true/false, Default: true - tentukan apakah Anda ingin menambahkan jalur target ke jalur proxy
abaikanPath : benar/salah, Default: salah - tentukan apakah Anda ingin mengabaikan jalur proxy dari permintaan masuk (catatan: Anda harus menambahkan / secara manual jika diperlukan).
localAddress : String antarmuka lokal untuk mengikat koneksi keluar
changeOrigin : benar/salah, Default: salah - mengubah asal header host menjadi URL target
preservHeaderKeyCase : true/false, Default: false - tentukan apakah Anda ingin menyimpan huruf besar kunci header respons
auth : Otentikasi dasar yaitu 'pengguna: kata sandi' untuk menghitung header Otorisasi.
hostRewrite : menulis ulang nama host lokasi pada pengalihan (201/301/302/307/308).
autoRewrite : menulis ulang lokasi host/port pada pengalihan (201/301/302/307/308) berdasarkan host/port yang diminta. Bawaan: salah.
ProtocolRewrite : menulis ulang protokol lokasi pada (201/301/302/307/308) dialihkan ke 'http' atau 'https'. Bawaan: nol.
cookieDomainRewrite : menulis ulang domain header set-cookie
. Nilai yang mungkin:
false
(default): menonaktifkan penulisan ulang cookiecookieDomainRewrite: "new.domain"
. Untuk menghapus domain, gunakan cookieDomainRewrite: ""
."*"
untuk mencocokkan semua domain. Misalnya membiarkan satu domain tidak berubah, menulis ulang satu domain, dan menghapus domain lainnya: cookieDomainRewrite: {
"unchanged.domain": "unchanged.domain",
"old.domain": "new.domain",
"*": ""
}
cookiePathRewrite : menulis ulang jalur header set-cookie
. Nilai yang mungkin:
false
(default): menonaktifkan penulisan ulang cookiecookiePathRewrite: "/newPath/"
. Untuk menghapus jalur, gunakan cookiePathRewrite: ""
. Untuk menyetel jalur ke root gunakan cookiePathRewrite: "/"
."*"
untuk mencocokkan semua jalur. Misalnya, agar satu jalur tidak berubah, tulis ulang satu jalur dan hapus jalur lainnya: cookiePathRewrite: {
"/unchanged.path/": "/unchanged.path/",
"/old.path/": "/new.path/",
"*": ""
}
headers : objek dengan header tambahan untuk ditambahkan ke permintaan target.
proxyTimeout : batas waktu (dalam mili) untuk permintaan proxy keluar
timeout : batas waktu (dalam mili) untuk permintaan masuk
followRedirects : benar/salah, Default: false - tentukan apakah Anda ingin mengikuti pengalihan
selfHandleResponse benar/salah, jika disetel ke benar, tidak ada satu pun pass webOutgoing yang dipanggil dan Anda bertanggung jawab untuk mengembalikan respons secara tepat dengan mendengarkan dan bertindak pada peristiwa proxyRes
buffer : aliran data untuk dikirim sebagai badan permintaan. Mungkin Anda memiliki beberapa middleware yang menggunakan aliran permintaan sebelum melakukan proksi, misalnya. Jika Anda membaca isi permintaan ke dalam bidang bernama 'req.rawbody', Anda dapat melakukan streaming ulang bidang ini di opsi buffer:
'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);
};
CATATAN: options.ws
dan options.ssl
bersifat opsional. options.target
dan options.forward
tidak boleh hilang
Jika Anda menggunakan metode proxyServer.listen
, opsi berikut juga berlaku:
Kembali ke atas
error
: Peristiwa kesalahan dikeluarkan jika permintaan ke target gagal. Kami tidak melakukan penanganan kesalahan apa pun terhadap pesan yang diteruskan antara klien dan proksi, dan pesan yang diteruskan antara proksi dan target, jadi Anda disarankan untuk mendengarkan kesalahan dan menanganinya.proxyReq
: Event ini dikeluarkan sebelum data dikirim. Ini memberi Anda kesempatan untuk mengubah objek permintaan proxyReq. Berlaku untuk koneksi "web".proxyReqWs
: Event ini dikeluarkan sebelum data dikirim. Ini memberi Anda kesempatan untuk mengubah objek permintaan proxyReq. Berlaku untuk koneksi "websocket".proxyRes
: Event ini dikeluarkan jika permintaan ke target mendapat respon.open
: Acara ini dikeluarkan setelah soket web proxy dibuat dan disalurkan ke soket web target.close
: Acara ini dikeluarkan setelah soket web proxy ditutup.proxySocket
: Tidak digunakan lagi dan digantikan dengan 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' ) ;
} ) ;
Kembali ke atas
var proxy = new httpProxy . createProxyServer ( {
target : {
host : 'localhost' ,
port : 1337
}
} ) ;
proxy . close ( ) ;
Kembali ke atas
Jika Anda ingin menangani respons Anda sendiri setelah menerima proxyRes
, Anda dapat melakukannya dengan selfHandleResponse
. Seperti yang Anda lihat di bawah, jika Anda menggunakan opsi ini, Anda dapat mencegat dan membaca proxyRes
tetapi Anda juga harus memastikan untuk membalas res
itu sendiri jika tidak, klien asli tidak akan pernah menerima data apa pun.
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 tabel proksi tersedia melalui modul tambahan ini, yang memungkinkan Anda menentukan serangkaian aturan untuk menerjemahkan rute yang cocok ke rute target yang akan diajak bicara oleh proksi terbalik.
$ npm test
Logo dibuat oleh Diego Pasquali
Kembali ke atas
master
)Kembali ke atas
Lisensi MIT (MIT)
Hak Cipta (c) 2010 - 2016 Charlie Robbins, Jarrett Cruger & Kontributor.
Izin dengan ini diberikan, secara gratis, kepada siapa pun yang memperoleh salinan perangkat lunak ini dan file dokumentasi terkait ("Perangkat Lunak"), untuk menggunakan Perangkat Lunak tanpa batasan, termasuk namun tidak terbatas pada hak untuk menggunakan, menyalin, memodifikasi, menggabungkan , mempublikasikan, mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak, dan mengizinkan orang yang menerima Perangkat Lunak untuk melakukan hal tersebut, dengan tunduk pada ketentuan berikut:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini akan disertakan dalam semua salinan atau sebagian besar Perangkat Lunak.
PERANGKAT LUNAK INI DISEDIAKAN "APA ADANYA", TANPA JAMINAN APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN KELAYAKAN UNTUK DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU, DAN TIDAK ADA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, HUKUM ATAU LAINNYA, YANG TIMBUL DARI, DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU PENGGUNAAN ATAU HAL-HAL LAIN DALAM PERANGKAT LUNAK.