当前位置: 首页 > 后端技术 > Node.js

http-proxy-middleware服务代理

时间:2023-04-03 18:32:32 Node.js

本文被《webpack、npm探索之路》收录本文为http-proxy-middleware官网翻译单线程node.js代理中间件,用于连接,快速和浏览器同步Node.js代理很简单。轻松配置代理中间件连接、express、浏览器同步等。由流行的Nodejitsuhttp代理提供。TL;DRProxy/api请求到http://www.example.orgvarexpress=require('express');varproxy=require('http-proxy-middleware');varapp=express();app.使用('/api',proxy({target:'http://www.example.org',changeOrigin:true}));app.listen(3000);可以使用所有http-proxy选项,以及一些额外的http-proxy-middleware选项。提示:将基于名称的虚拟主机站点的选项changeOrigin设置为true。安装$npminstall--save-devhttp-proxy-middleware核心概念proxy([context,]config)varproxy=require('http-proxy-middleware');varapiProxy=proxy('/api',{target:'http://www.example.org'});//\____/\_____________________________///||//上下文选项//'apiProxy'现在可以用作服务器中的中间件了。上下文:确定应将哪些请求代理到目标主机。(更多关于上下文匹配)options.target:目标主机到代理。(protocol+host)(http-proxy-middleware配置选项的完整列表)proxy(uri[,config])//上述示例的简写语法:varapiProxy=proxy('http://www.example.org/接口');更多关于速记配置。举个栗子使用expressserver的例子。//包含依赖项varexpress=require('express');varproxy=require('http-proxy-middleware');//代理中间件选项varoptions={target:'http://www.example.org',//目标主机changeOrigin:true,//虚拟托管站点需要ws:true,//代理websocketspathRewrite:{'^/api/old-path':'/api/new-path',//重写路径'^/api/remove/path':'/path'//删除基本路径},router:{//当request.headers.host=='dev.localhost:3000',//覆盖目标'http://www.example.org'to'http://localhost:8000''dev.localhost:3000':'http://localhost:8000'}};//创建代理(没有上下文)varexampleProxy=proxy(options);//在网络服务器中挂载`exampleProxy`varapp=express();app.use('/api',exampleProxy);app.listen(3000);匹配代理规则提供了一种替代方法来决定哪个请求应该代理;如果您不能使用服务器的路径参数来加载代理,或者需要更大的灵活性RFC3986路径用于上下文匹配。foo://example.com:8042/over/there?name=ferret#nose\_/\_____________/\_________/\_________/\__/|||||schemeauthoritypathqueryfragmentpathmatchproxy({...})-匹配任何路径,所有请求都将被代理。proxy('/',{...})-匹配任何路径,所有请求都将被代理。proxy('/api',{...})-匹配所有以/api开头的路径。多路径匹配proxy(['/api','/ajax','/someotherpath'],{...})通配符路径匹配对于细粒度的控制,可以使用通配符匹配。通过微匹配进行全局模式匹配。访问micromatch或glob以获得更多通配示例。proxy('**',{...})匹配任何路径,所有请求都将被代理。proxy('**/*.html',{...})匹配任何以.html结尾的路径。proxy('/*.html',{...})直接匹配绝对路径下的路径。proxy('/api/**/*.html',{...})匹配/api路径下以.html结尾的请求。proxy(['/api/**','/ajax/**'],{...})结合了多种路由模式。proxy(['/api/**','!**/bad.json'],{...})排除匹配项。自定义匹配为了完全控制,您可以提供自定义函数来确定应代理哪些请求。varfilter=function(pathname,req){return(pathname.match('^/api')&&req.method==='GET');};varapiProxy=proxy(filter,{target:'http://www.example.org'})optionhttp-proxy-middlewareoptionoption.pathRewrite:Object/Function,重写target的url路径。对象键将用作RegExp以匹配路径。//重写路径pathRewrite:{'^/old/api':'/new/api'}//删除路径pathRewrite:{'^/remove/api':''}//添加基本路径pathRewrite:{'^/':'/basepath/'}//自定义重写pathRewrite:function(path,req){returnpath.replace('/api','/base/api')}option.router:Object/Function,relocateoption.target用于特定请求。//使用`host`和/或`path`来匹配请求。将使用第一个匹配项。//配置的顺序很重要。router:{'integration.localhost:3000':'http://localhost:8001',//仅主机'staging.localhost:3000':'http://localhost:8002',//仅主机'localhost:3000/api':'http://localhost:8003',//主机+路径'/rest':'http://localhost:8004'//仅路径}//自定义路由功能router:function(req){return'http://localhost:8004';}option.logLevel:String,['debug','info','warn','error','silent']。默认:info。option.logProvider:Function,修改或替换日志服务。默认:console。//简单替换函数logProvider(provider){//替换默认的控制台日志提供程序。returnrequire('winston');}//详细替换函数logProvider(provider){varlogger=new(require('winston').Logger)();varmyCustomProvider={log:logger.log,debug:logger.debug,info:logger.info,warn:logger.warn,error:logger.error}returnmyCustomProvider;}-(已弃用)选项.proxyHost:替换为选项。改变来源=真。-(已弃用)option.proxyTable:改用option.router。http-proxyeventoption.onError:函数,订阅http-proxy的error事件,用于自定义错误处理。functiononError(err,req,res){res.writeHead(500,{'Content-Type':'text/plain'});res.end('出错了。我们正在报告自定义错误消息。');option.onProxyRes:Function,订阅http-proxy的proxyRes事件。functiononProxyRes(proxyRes,req,res){proxyRes.headers['x-added']='foobar';//向响应添加新标头deleteproxyRes.headers['x-removed'];//从响应中删除标头}option.onProxyReq:Function,订阅http-proxy的proxyReq事件。functiononProxyReq(proxyReq,req,res){//添加自定义标头到请求proxyReq.setHeader('x-added','foobar');//或记录请求}option.onProxyReqWs:Function,订阅http-proxy的proxyReqWs事件。functiononProxyReqWs(proxyReq,req,socket,options,head){//添加自定义标头proxyReq.setHeader('X-Special-Proxy-Header','foobar');}option.onOpen:Function,订阅http-proxy的open事件。functiononOpen(proxySocket){//监听来自这里目标的消息proxySocket.on('data',hybiParseAndLogMessage);}option.onClose:函数,订阅http-proxy的关闭事件。functiononClose(res,socket,head){//查看断开的websocket连接console.log('Clientdisconnected');http-proxy选项底层的http-proxy库提供了以下选项。option.target:url字符串将使用url模块选项进行解析。forward:url字符串将使用url模块选项进行解析。target:传递给http(s)请求的对象(请参阅节点https代理和http代理object)option.ssl:objectpassedtohttps.createServer()option.ws:true/false,如果你想代理websocketsoption.xfwd:true/false,添加x-forward请求头option.secure:true/false,如果你想要身份验证SSL证书option.toProxy:true/false,以绝对URL作为路径(在使用代理时很有用)option.prependPath:true/false,default:true-指定是否要在目标的前面加上代理路径选项的路径。ignorePath:true/false,default:false-指定是否要忽略传入请求的代理路径(注意:如果需要,您将必须附加/手动)。option.localAddress:用于传出连接的本地接口字符串option.changeOrigin:true/false,默认值:false-将主机头的来源更改为目标URLoption.auth:基本身份验证,即“用户:密码”以计算授权标头。option.hostRewrite:重写(301/302/307/308)重定向位置主机名。option.autoRewrite:根据请求的主机/端口重写(301/302/307/308)重定向的位置主机/端口。默认值:假。option.protocolRewrite:重写位置协议(301/302/307/308)以重定向到“http”或“https”。默认值:空。option.cookieDomainRewrite:重写set-cookie标头的域。可能的值:false(默认):禁用重写cookie字符串:新域名,比如cookieDomainRewrite:“new.domain”。使用cookieDomainRewrite:""删除域名。Object:域名到新域名的映射,用“*”匹配所有域名。例如:保持一个域名不变,重写一个域名,删除其他:cookieDomainRewrite:{"unchanged.domain":"unchanged.domain","old.domain":"new.domain","*":""}option.headers:对象,添加请求头。(例如:{host:'www.example.org'})option.proxyTimeout:超时时间(毫秒)当proxy无法接收到目标服务器返回的简写时当不需要详细配置时,请使用简写语法。使用速记时,上下文和option.target将自动配置。如果需要,仍然可以使用选项。proxy('http://www.example.org:8000/api');//proxy('/api',{target:'http://www.example.org:8000'});proxy('http://www.example.org:8000/api/books/*/**.json');//proxy('/api/books/*/**.json',{target:'http://www.example.org:8000'});proxy('http://www.example.org:8000/api',{changeOrigin:true});//proxy('/api',{target:'http://www.example.org:8000',changeOrigin:true});app.use(path,proxy)如果要使用服务器的app.usepath参数来匹配请求;在没有http-proxy-middleware的情况下创建和加载上下文参数代理:app.use('/api',proxy({target:'http://www.example.org',changeOrigin:true}));app.使用文档快递:http://expressjs。com/en/4x/api.html#app.useconnect:https://github.com/senchalabs/connect#mount-middlewareWebsocket//verboseapiproxy('/',{target:'http://echo.websocket.org',ws:true});//速记代理('http://echo.websocket.org',{ws:true});//速记代理('ws://echo.websocket.org');外部WebSocket升级在前面的WebSocket示例中,http代理中间件依赖于初始http请求来侦听http升级事件。如果您需要在没有初始http请求的情况下代理WebSockets,您可以手动订阅服务器的http升级事件。varwsProxy=proxy('ws://echo.websocket.org',{changeOrigin:true});varapp=express();app.use(wsProxy);varserver=app.listen(3000);服务器。on('升级',wsProxy.upgrade);//<--订阅http'升级'