单线程node.js代理中间件,用于连接,快速和浏览器同步

Node.js代理简单。 轻松配置代理中间件连接,快速,浏览器同步等。

由流行的Nodejitsu http代理提供。

TL;DR

代理/ api请求到http://www.example.org

 var express = require('express');
var proxy = require('http-proxy-middleware'); var app = express(); app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));
app.listen(3000);

可以使用所有http-proxy选项,以及一些额外的http-proxy-middleware选项。

提示:将基于名称的虚拟托管网站的选项changeOrigin设置为true

内容列表

  • 安装
  • 核心概念
  • 举个栗子
  • 上下文匹配
  • 选项 
    • http-proxy-middleware选项
    • http-proxy事件
    • http-proxy选项
  • 速记 
    • app.use(path, proxy)
  • WebSocket 
    • 外部Websocket升级
  • 工作示例
  • Recipes
  • 兼容的服务器
  • 测试
  • 更新日志
  • License

Install

$ npm install --save-dev http-proxy-middleware

proxy([context,] config)

var proxy = require('http-proxy-middleware');

var apiProxy = proxy('/api', {target: 'http://www.example.org'});
// \____/ \_____________________________/
// | |
// context options // 'apiProxy' is now ready to be used as middleware in a server.
  • context:确定应将哪些请求代理到目标主机。 (更多关于上下文匹配)
  • options.target:目标主机到代理。 (协议+主机)

http-proxy-middleware配置选项的完整列表)

proxy(uri [, config])

// shorthand syntax for the example above:
var apiProxy = proxy('http://www.example.org/api');

更多关于速记配置。


举个栗子

使用express服务器的示例。

// include dependencies
var express = require('express');
var proxy = require('http-proxy-middleware'); // proxy middleware options
var options = {
target: 'http://www.example.org', // target host
changeOrigin: true, // needed for virtual hosted sites
ws: true, // proxy websockets
pathRewrite: {
'^/api/old-path' : '/api/new-path', // rewrite path
'^/api/remove/path' : '/path' // remove base path
},
router: {
// when request.headers.host == 'dev.localhost:3000',
// override target 'http://www.example.org' to 'http://localhost:8000'
'dev.localhost:3000' : 'http://localhost:8000'
}
}; // create the proxy (without context)
var exampleProxy = proxy(options); // mount `exampleProxy` in web server
var app = express();
app.use('/api', exampleProxy);
app.listen(3000);

Context matching

提供一种替代方式来决定哪些请求应该被代理;如果您无法使用服务器的路径参数来装载代理,或者需要更多的灵活性。

RFC 3986路径用于上下文匹配。

         foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
  • 路径匹配

    • proxy({...}) - 匹配任意路径,所有的请求都会被代理。
    • proxy('/', {...})-匹配任意路径,所有的请求都会被代理。
    • proxy('/api', {...})-匹配所有以/api开始的路径。
  • 多重路径匹配 
    • proxy(['/api', '/ajax', '/someotherpath'], {...})
  • 通配符路径匹配 
    对于细粒度控制,您可以使用通配符匹配。通过micromatch进行全局模式匹配。访问micromatchglob更多globbing示例。

    • proxy('**', {...}) 匹配任意路径,所有的请求都会被代理。
    • proxy('**/*.html', {...}) 匹配所有以.html结尾的任意路径。
    • proxy('/*.html', {...}) 直接匹配绝对路径下的路径。
    • proxy('/api/**/*.html', {...})匹配在/api路径下以.html结尾的请求。
    • proxy(['/api/**', '/ajax/**'], {...})组合多重路由模式。
    • proxy(['/api/**', '!**/bad.json'], {...})排除匹配。
  • 自定义匹配 
    为了完全控制,您可以提供一个自定义函数来确定哪些请求应该被代理。
var filter = function (pathname, req) {
return (pathname.match('^/api') && req.method === 'GET');
}; var apiProxy = proxy(filter, {target: 'http://www.example.org'})

选项

http-proxy-middleware选项

  • option.pathRewrite:对象/函数,重写目标的url路径。对象键将被用作RegExp来匹配路径。

     // rewrite path
    pathRewrite: {'^/old/api' : '/new/api'} // remove path
    pathRewrite: {'^/remove/api' : ''} // add base path
    pathRewrite: {'^/' : '/basepath/'} // custom rewriting
    pathRewrite: function (path, req) { return path.replace('/api', '/base/api') }
        option.router:对象/函数,重新定位特定请求的

option.target

 // Use `host` and/or `path` to match requests. First match will be used.
// The order of the configuration matters.
router: {
'integration.localhost:3000' : 'http://localhost:8001', // host only
'staging.localhost:3000' : 'http://localhost:8002', // host only
'localhost:3000/api' : 'http://localhost:8003', // host + path
'/rest' : 'http://localhost:8004' // path only
} // Custom router function
router: function(req) {
return 'http://localhost:8004';
}


        option.logLevel:字符串, [‘debug’, ‘info’, ‘warn’, ‘error’, ‘silent’]. 默认:

'info'

        • option.logProvider:函数,修改或者替换日志服务。默认:'console'

           // simple replace
          function logProvider(provider) {
          // replace the default console log provider.
          return require('winston');
          }
          // verbose replacement
          function logProvider(provider) {
          var logger = new (require('winston').Logger)(); var myCustomProvider = {
          log: logger.log,
          debug: logger.debug,
          info: logger.info,
          warn: logger.warn,
          error: logger.error
          }
          return myCustomProvider;
          }
        • 1(已弃用)option.proxyHost:用

option.changeOrigin = true

        代替。
        • (已弃用)option.proxyTable:用option.router代替。

        • http-proxy 事件

订阅http-proxy事件

        • option.onError:函数,订阅http-proxyerror事件以进行自定义错误处理。

           function onError(err, req, res) {
          res.writeHead(500, {
          'Content-Type': 'text/plain'
          });
          res.end('Something went wrong. And we are reporting a custom error message.');
          }
        • option.onProxyRes:函数,订阅

http-proxy

proxyRes

        事件。
 function onProxyRes(proxyRes, req, res) {
proxyRes.headers['x-added'] = 'foobar'; // add new header to response
delete proxyRes.headers['x-removed']; // remove header from response
} option.onProxyReq:函数,订阅http-proxy的proxyReq事件。
function onProxyReq(proxyReq, req, res) {
// add custom header to request
proxyReq.setHeader('x-added', 'foobar');
// or log the req
}
option.onProxyReqWs:函数,订阅http-proxy的proxyReqWs事件。
function onProxyReqWs(proxyReq, req, socket, options, head) {
// add custom header
proxyReq.setHeader('X-Special-Proxy-Header', 'foobar');
}
        option.onOpen:函数,订阅

http-proxy

open

      事件。
 function onOpen(proxySocket) {
// listen for messages coming FROM the target here
proxySocket.on('data', hybiParseAndLogMessage);
}
  • option.onClose:函数,订阅http-proxy 的close事件。

     function onClose(res, socket, head) {
    // view disconnected websocket connections
    console.log('Client disconnected');
    }

http-proxy选项

底层http-proxy库提供以下选项。

  • option.target:url字符串将与url模块解析
  • option.forward:url字符串将与url模块解析
  • option.target:传递给http(s)请求的对象(参阅Node https代理和http代理对象)
  • option.ssl:传递给https.createServer()的对象
  • option.ws:true / false,如果你想要代理websockets
  • option.xfwd:true / false,添加x-forward请求头
  • option.secure:true / false,如果你想要验证SSL证书
  • option.toProxy:true / false,将绝对URL作为path(对代理使用代理时很有用)
  • option.prependPath:true / false,默认:true-指定是否要将目标的路径预置到代理路径
  • option.ignorePath:true / false,默认:false-指定是否要忽略传入请求的代理路径(注意:如果需要,您将必须附加/手动)。
  • option.localAddress:用于传出连接的本地接口字符串
  • option.changeOrigin:true / false,默认值:false - 将主机头的源更改为目标URL
  • option.auth:基本认证,即“用户:密码”来计算授权头。
  • option.hostRewrite:重写(301/302/307/308)重定向的位置主机名。
  • option.autoRewrite:根据请求的主机/端口重写(301/302/307/308)重定向的位置主机/端口。默认值:false。
  • option.protocolRewrite:重写位置协议(301/302/307/308)重定向到’http’或’https’。默认值:null。
  • option.cookieDomainRewrite:重写set-cookie标头的域。可能的值: 
    false(默认):禁止重写cookie 
    - 字符串:新域名,比如说cookieDomainRewrite:"new.domain"。使用cookieDomainRewrite:""删除域名。 
    - 对象:域名到新域名的映射,用”*”匹配所有域名。 
    举个栗子:保持一个域名不变,重写一个域名并且删除其他的: 

    cookieDomainRewrite: { 
    "unchanged.domain": "unchanged.domain", 
    "old.domain": "new.domain", 
    "*": "" 

  • option.headers:对象,添加请求头。(比如:{host:'www.example.org'}
  • option.proxyTimeout:超时时间(毫秒)当代理接收不到目标服务器的返回

速记

当不需要详细配置时,请使用简写语法。当使用速记时,上下文和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.use文档


Websocket

 // verbose api
proxy('/', {target:'http://echo.websocket.org', ws:true}); // shorthand
proxy('http://echo.websocket.org', {ws:true}); // shorter shorthand
proxy('ws://echo.websocket.org');
 

外部WebSocket升级

在以前的WebSocket示例中,http代理中间件依赖于初始http请求以便侦听http升级事件。如果需要在没有初始http请求的情况下代理WebSockets,则可以手动预订服务器的http升级事件。

 var wsProxy = proxy('ws://echo.websocket.org', {changeOrigin:true});

 var app = express();
app.use(wsProxy); var server = app.listen(3000);
server.on('upgrade', wsProxy.upgrade); // <-- subscribe to http 'upgrade'

npm模块之http-proxy-middleware使用教程(译)的更多相关文章

  1. [转] npm 模块安装机制简介

    npm 是 Node 的模块管理器,功能极其强大.它是 Node 获得成功的重要原因之一. 正因为有了npm,我们只要一行命令,就能安装别人写好的模块 . $ npm install 本文介绍 npm ...

  2. npm 模块安装机制简介

    npm 是 Node 的模块管理器,功能极其强大.它是 Node 获得成功的重要原因之一. 正因为有了npm,我们只要一行命令,就能安装别人写好的模块 . $ npm install 本文介绍 npm ...

  3. nodejs安装及npm模块插件安装路径配置

    在学习完js后,我们就要进入nodejs的学习,因此就必须配置nodejs和npm的属性了. 我相信,个别人在安装时会遇到这样那样的问题,看着同学都已装好,难免会焦虑起来.于是就开始上网查找解决方案, ...

  4. npm模块安装机制

    npm 是 Node 的模块管理器,功能极其强大.它是 Node 获得成功的重要原因之一.正因为有了npm,我们只要一行命令:npm install,就能安装别人写好的模块 . 一.从 npm ins ...

  5. 如何在Meteor中使用npm模块?

    首先,请在AtmosphereJs上搜索有无相关的封装包.尽量采用已有的封装包,而不是自己封装. 有两种方法在项目中使用来自npm的模块. 封装为Meteor包并在项目中添加包.使用meteor cr ...

  6. cplusplus 库 在线管理; 类似于 python的 pip install 、nodejs 的npm模块

    cplusplus 库 在线管理: 类似于 python的 pip install .nodejs 的npm模块 还有 apache 经常使用的 Apache Ivy 项目依赖管理工具/Maven 这 ...

  7. 调试和开发npm模块的方式

    ln -s(软连接) 假设my-project是运行npm模块的项目,vue-router是我们需要调试的npm模块 将vue-router下载到与my-project同级目录中. git clone ...

  8. 小程序使用npm模块(引入第三方UI),报错的多种解决办法。

    前言引入第三方模块时,我遇到了很多坑. 首先是微信.第三方模块的文档描述不清楚.其次.搜索到的博客,大部分是抄的文档 / 相互转载抄袭.作用有限. 于是,我自己做了各种条件下的测试.解决各种情况的引入 ...

  9. npm模块安装机制简介

    npm是node的模块管理器,功能及其强大,它是node获得成功的重要原因之一. 正因为有了nom,我们只要一行命令,就能安装别人写好的模块. $ npm install 本文介绍npm模块安装机制的 ...

随机推荐

  1. 通过sqli-labs学习sql注入——基础挑战之less1-3

    首先,先看一些基础知识吧!!!!本人只是初学者,记录一下自己的学习过程,有什么错误之处请指出,谢谢!大佬请绕过!!!! url编码:一般的url编码其实就是那个字符的ASCII值得十六进制,再在前面加 ...

  2. Q矩阵输出

    程序启动时: 1.Q矩阵在InitQX中对角阵赋初值为0.25,GPS卫星数6 2.Q矩阵初值在初始化时由GetBL获得,改变Q对角阵 Q初值第0个卫星 10000000000.000 X初值第0个卫 ...

  3. MySql详解(一)

    MySql详解(一) 作为一名Java开发人员,数据库的地位不用多说了.从大学时期的SqlServer,到现在最流行的MySql和Oracle.前者随着阿里巴巴的去IOE化,在互联网公司中的使用比例是 ...

  4. Jmeter遇到线程链接被重置(Connection reset by peer: socket write error)的解决方法

    做性能测试的时候遇到一个很奇怪的问题,多线程的计划,有一个线程第一次能跑过,第二次确跑不过,单独跑这个线程跑多少次都没有问题,把思考时间改短也没有问题,唯独出现在特定的状态下,特定状态是啥,也不得而知 ...

  5. Python2.7-StringIO和cStringIO

    官方文档:https://docs.python.org/2/library/stringio.html StringIO 和 cStringIO 都是对内存中的文件进行读写,操作方法与文件操作类似, ...

  6. lvs 最常用算法 + tcpdump vrrp 抓包

    1.SH: source hash, 源地址散列. 将请求的目标IP地址换成请求的源IP地址:实现session保持的机制:将来自于同一个IP的请求始终调度至同一RS: 源地址散列调度算法正好与目标地 ...

  7. rpm yum apt-get redhat centos ubuntu

    rpm是由红帽公司开发的软件包管理方式,使用rpm我们可以方便的进行软件的安装.查询.卸载.升级等工作.但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时.Yum(全称为 Y ...

  8. VBA读取、增加自定义和修改文档属性

    读取系统文档属性 Sub read()On Error Resume Nextrw = 1Worksheets(1).ActivateFor Each p In ActiveWorkbook.Buil ...

  9. STS-创建spring配置文件

    1.创建一个bean文件 2.输入文件名applicationContext.xml 3.这里会自动显示模板文件 4.创建后,自动填充头不定义 到这里就可以发现,我们创建spring文件时,需要的配置 ...

  10. 一个IOS自动化打包的脚本

    网上找了一个脚本,在其中进行了修改,只需要一条命令就可以了 支持自动导入配置文件 支持自动安装p12证书 支持自动修改版本号和build版本号 支持自动修改app显示名称 支持自动修改bundle i ...