node-http-proxy
عبارة عن مكتبة وكيل HTTP قابلة للبرمجة وتدعم مآخذ الويب. إنها مناسبة لتنفيذ مكونات مثل الوكلاء العكسيين وموازنات التحميل.
npm install http-proxy --save
العودة إلى الأعلى
انقر هنا
العودة إلى الأعلى
يتم إنشاء وكيل جديد عن طريق استدعاء createProxyServer
وتمرير كائن options
كوسيطة (تتوفر الخصائص الصالحة هنا)
var httpProxy = require ( 'http-proxy' ) ;
var proxy = httpProxy . createProxyServer ( options ) ; // See (†)
†ما لم يتم استدعاء الاستماع (..) على الكائن، فإن هذا لا يؤدي إلى إنشاء خادم ويب. انظر أدناه.
سيتم إرجاع الكائن بأربع طرق:
req, res, [options]
(تُستخدم لتوكيل طلبات HTTP(S) العادية)req, socket, head, [options]
(يستخدم لتوكيل طلبات WS(S))port
الاستماع (وظيفة تقوم بتغليف الكائن في خادم الويب، من أجل راحتك)[callback]
(وظيفة تغلق خادم الويب الداخلي وتتوقف عن الاستماع على منفذ معين)ومن الممكن بعد ذلك وكيل الطلبات عن طريق استدعاء هذه الوظائف
http . createServer ( function ( req , res ) {
proxy . web ( req , res , { target : 'http://mytarget.com:8080' } ) ;
} ) ;
يمكن الاستماع إلى الأخطاء إما باستخدام Event Emitter API
proxy . on ( 'error' , function ( e ) {
...
} ) ;
أو باستخدام واجهة برمجة تطبيقات رد الاتصال
proxy . web ( req , res , { target : 'http://mytarget.com:8080' } , function ( e ) { ... } ) ;
عندما يتم إنشاء وكيل، فإنه يتبع مسارين مختلفين (متاحين هنا) يطبقان التحويلات على كل من كائن req
و res
. يكون خط الأنابيب الأول (الوارد) مسؤولاً عن إنشاء ومعالجة الدفق الذي يربط عميلك بالهدف. يكون خط الأنابيب الثاني (الصادر) مسؤولاً عن إنشاء التدفق ومعالجته، والذي يقوم بإرجاع البيانات من هدفك إلى العميل.
العودة إلى الأعلى
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 ) ;
† يؤدي استدعاء الاستماع (..) إلى إنشاء خادم ويب. وإلا، فسيتم إنشاء مثيل الوكيل فقط.
العودة إلى الأعلى
يوضح هذا المثال كيف يمكنك وكيل طلب باستخدام خادم 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 ) ;
العودة إلى الأعلى
يمكنك تفعيل التحقق من صحة شهادة SSL الآمنة للاتصال المستهدف (تجنب الشهادات الموقعة ذاتيًا)، فقط قم بتعيين secure: true
في الخيارات.
//
// 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 ) ;
العودة إلى الأعلى
يمكنك تفعيل دعم websocket للوكيل باستخدام ws:true
في الخيارات.
//
// Create a proxy server for websockets
//
httpProxy . createServer ( {
target : 'ws://localhost:9014' ,
ws : true
} ) . listen ( 8014 ) ;
كما يمكنك أيضًا إنشاء وكيل لطلبات websocket فقط من خلال استدعاء طريقة 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 ) ;
العودة إلى الأعلى
يدعم httpProxy.createProxyServer
الخيارات التالية:
الهدف : سلسلة عنوان url التي سيتم تحليلها باستخدام وحدة عنوان url
إلى الأمام : سيتم تحليل سلسلة عنوان url باستخدام وحدة عنوان url
الوكيل : الكائن الذي سيتم تمريره إلى http(s).request (راجع وكيل https الخاص بالعقدة وكائنات وكيل http)
ssl : الكائن المراد تمريره إلى https.createServer()
ws : صحيح/خطأ، إذا كنت تريد وكيل websockets
xfwd : صحيح/خطأ، يضيف رؤوس x-forward
آمن : صواب/خطأ، إذا كنت تريد التحقق من شهادات SSL
toProxy : true/false، يمرر عنوان URL المطلق path
(مفيد للوكلاء إلى الوكلاء)
prependPath : صحيح/خطأ، الافتراضي: صحيح - حدد ما إذا كنت تريد إضافة مسار الهدف إلى مسار الوكيل
تجاهل المسار : صحيح/خطأ، الافتراضي: خطأ - حدد ما إذا كنت تريد تجاهل مسار الوكيل للطلب الوارد (ملاحظة: سيتعين عليك الإلحاق / يدويًا إذا لزم الأمر).
localAddress : سلسلة الواجهة المحلية لربط الاتصالات الصادرة
ChangeOrigin : true/false، الافتراضي: false - يغير أصل رأس المضيف إلى عنوان URL الهدف
PreserveHeaderKeyCase : صحيح/خطأ، الافتراضي: خطأ - حدد ما إذا كنت تريد الاحتفاظ بحالة الأحرف لمفتاح رأس الاستجابة
auth : المصادقة الأساسية، أي "المستخدم: كلمة المرور" لحساب رأس التفويض.
hostRewrite : يعيد كتابة اسم مضيف الموقع في عمليات إعادة التوجيه (201/301/302/307/308).
إعادة الكتابة التلقائية : يعيد كتابة مضيف/منفذ الموقع في عمليات إعادة التوجيه (201/301/302/307/308) بناءً على المضيف/المنفذ المطلوب. الافتراضي: خطأ.
بروتوكول إعادة الكتابة : يعيد كتابة بروتوكول الموقع على (201/301/302/307/308) يعيد التوجيه إلى "http" أو "https". الافتراضي: خالي.
cookieDomainRewrite : يعيد كتابة مجال رؤوس set-cookie
. القيم المحتملة:
false
(افتراضي): تعطيل إعادة كتابة ملفات تعريف الارتباطcookieDomainRewrite: "new.domain"
. لإزالة المجال، استخدم cookieDomainRewrite: ""
."*"
لمطابقة كافة المجالات. على سبيل المثال، احتفظ بمجال واحد دون تغيير، وأعد كتابة مجال واحد وقم بإزالة المجالات الأخرى: cookieDomainRewrite: {
"unchanged.domain": "unchanged.domain",
"old.domain": "new.domain",
"*": ""
}
cookiePathRewrite : يعيد كتابة مسار رؤوس set-cookie
. القيم المحتملة:
false
(افتراضي): تعطيل إعادة كتابة ملفات تعريف الارتباطcookiePathRewrite: "/newPath/"
. لإزالة المسار، استخدم cookiePathRewrite: ""
. لتعيين المسار إلى الجذر، استخدم cookiePathRewrite: "/"
."*"
لمطابقة جميع المسارات. على سبيل المثال، للحفاظ على مسار واحد دون تغيير، أعد كتابة مسار واحد وقم بإزالة المسارات الأخرى: cookiePathRewrite: {
"/unchanged.path/": "/unchanged.path/",
"/old.path/": "/new.path/",
"*": ""
}
الرؤوس : كائن يحتوي على رؤوس إضافية ليتم إضافتها إلى الطلبات المستهدفة.
proxyTimeout : المهلة (بالمللي) لطلبات الوكيل الصادرة
المهلة : المهلة (بالمللي) للطلبات الواردة
FollowRedirects : true/false، الافتراضي: false - حدد ما إذا كنت تريد متابعة عمليات إعادة التوجيه
selfHandleResponse صحيح/خطأ، إذا تم تعيينه على true، فلن يتم استدعاء أي من تمريرات webOutgoing وتقع على عاتقك مسؤولية إرجاع الاستجابة بشكل مناسب من خلال الاستماع إلى حدث proxyRes
والتصرف فيه
المخزن المؤقت : دفق من البيانات لإرسالها كنص الطلب. ربما يكون لديك بعض البرامج الوسيطة التي تستهلك تدفق الطلب قبل توكيله، على سبيل المثال، إذا قرأت نص الطلب في حقل يسمى "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. ينطبق على اتصالات "الويب".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 ) ;
تتوفر واجهة برمجة تطبيقات جدول الوكيل من خلال وحدة الوظيفة الإضافية هذه، والتي تتيح لك تحديد مجموعة من القواعد لترجمة المسارات المطابقة إلى المسارات المستهدفة التي سيتحدث إليها الوكيل العكسي.
$ npm test
الشعار الذي أنشأه دييغو باسكوالي
العودة إلى الأعلى
master
)العودة إلى الأعلى
رخصة معهد ماساتشوستس للتكنولوجيا (MIT)
حقوق الطبع والنشر (ج) 2010 - 2016 مملوكة لتشارلي روبينز وجاريت كروجر والمساهمين.
يُمنح الإذن مجانًا لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج")، للتعامل في البرنامج دون قيود، بما في ذلك، على سبيل المثال لا الحصر، حقوق الاستخدام والنسخ والتعديل والدمج. ونشر و/أو توزيع وترخيص من الباطن و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين تم توفير البرنامج لهم بالقيام بذلك، وفقًا للشروط التالية:
يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا أو ضمنيًا، بما في ذلك، على سبيل المثال لا الحصر، ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. لا يتحمل المؤلفون أو أصحاب حقوق الطبع والنشر بأي حال من الأحوال المسؤولية عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في إجراء العقد أو الضرر أو غير ذلك، الناشئة عن أو خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو المعاملات الأخرى في برمجة.