详解Webpack-dev-server的proxy用法


Posted in Javascript onSeptember 08, 2018

前言

如果你有单独的后端开发服务器 API,并且希望在同域名下发送 API 请求 ,那么代理某些 URL 会很有用。

解决开发环境的跨域问题(不用在去配置nginx和host, 爽歪歪~~)

在webpack.config.js中配置

下面简单介绍一下五个经常使用的场景

使用一:

mmodule.exports = {
  //...
  devServer: {
    proxy: {
      '/api': 'http://localhost:3000'
    }
  }
};

请求到 /api/xxx 现在会被代理到请求 http://localhost:3000/api/xxx, 例如 /api/user 现在会被代理到请求 http://localhost:3000/api/user

使用二

如果你想要代码多个路径代理到同一个target下, 你可以使用由一个或多个「具有 context 属性的对象」构成的数组:

module.exports = {
  //...
  devServer: {
    proxy: [{
      context: ['/auth', '/api'],
      target: 'http://localhost:3000',
    }]
  }
};

使用三:

如果你不想始终传递 /api ,则需要重写路径:

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        pathRewrite: {'^/api' : ''}
      }
    }
  }
};

请求到 /api/xxx 现在会被代理到请求 http://localhost:3000/xxx, 例如 /api/user 现在会被代理到请求 http://localhost:3000/user

使用四:

默认情况下,不接受运行在 HTTPS 上,且使用了无效证书的后端服务器。如果你想要接受,只要设置 secure: false 就行。修改配置如下:

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'https://other-server.example.com',
        secure: false
      }
    }
  }
};

使用五:

有时你不想代理所有的请求。可以基于一个函数的返回值绕过代理。

在函数中你可以访问请求体、响应体和代理选项。必须返回 false 或路径,来跳过代理请求。

例如:对于浏览器请求,你想要提供一个 HTML 页面,但是对于 API 请求则保持代理。你可以这样做:

module.exports = {
 //...
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        bypass: function(req, res, proxyOptions) {
          if (req.headers.accept.indexOf('html') !== -1) {
            console.log('Skipping proxy for browser request.');
            return '/index.html';
          }
        }
      }
    }
  }  
};

解决跨域原理

上面的参数列表中有一个changeOrigin参数, 是一个布尔值, 设置为true, 本地就会虚拟一个服务器接收你的请求并代你发送该请求,

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
      }
    }
  }
};

vue-cli中proxyTable配置接口地址代理示例

修改 config/index.js

module.exports = {
  dev: {
  // 静态资源文件夹
  assetsSubDirectory: 'static',
  // 发布路径
  assetsPublicPath: '/',

  // 代理配置表,在这里可以配置特定的请求代理到对应的API接口
  // 使用方法:https://vuejs-templates.github.io/webpack/proxy.html
  proxyTable: {
    // 例如将'localhost:8080/api/xxx'代理到'https://wangyaxing.cn/api/xxx'
    '/api': {
      target: 'https://wangyaxing.cn', // 接口的域名
      secure: false, // 如果是https接口,需要配置这个参数
      changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
    },
    // 例如将'localhost:8080/img/xxx'代理到'https://cdn.wangyaxing.cn/xxx'
    '/img': {
      target: 'https://cdn.wangyaxing.cn', // 接口的域名
      secure: false, // 如果是https接口,需要配置这个参数
      changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
      pathRewrite: {'^/img': ''} // pathRewrite 来重写地址,将前缀 '/api' 转为 '/'。
    }
  },
  // Various Dev Server settings
  host: 'localhost', // can be overwritten by process.env.HOST
  port: 4200, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
}

更多参数

dev-server 使用了非常强大的http-proxy-middleware , http-proxy-middleware 基于 http-proxy 实现的,可以查看 http-proxy 的源码和文档:https://github.com/nodejitsu/node-http-proxy。

  • target:要使用url模块解析的url字符串
  • forward:要使用url模块解析的url字符串
  • agent:要传递给http(s).request的对象(请参阅Node的https代理和http代理对象)
  • ssl:要传递给https.createServer()的对象
  • ws:true / false,是否代理websockets
  • xfwd:true / false,添加x-forward标头
  • secure:true / false,是否验证SSL Certs
  • toProxy:true / false,传递绝对URL作为路径(对代理代理很有用)
  • prependPath:true / false,默认值:true - 指定是否要将目标的路径添加到代理路径
  • ignorePath:true / false,默认值:false - 指定是否要忽略传入请求的代理路径(注意:如果需要,您必须附加/手动)。
  • localAddress:要为传出连接绑定的本地接口字符串
  • changeOrigin:true / false,默认值:false - 将主机标头的原点更改为目标URL

参考

官方文档
http-proxy-middleware
node-http-proxy
API Proxying During Development

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
May 24 Javascript
JavaScript 大数据相加的问题
Aug 03 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
Dec 28 Javascript
Jquery实现页面加载时弹出对话框代码
Apr 19 Javascript
jQuery实现不断闪烁文字的方法
May 15 Javascript
IE10中flexigrid无法显示数据的解决方法
Jul 26 Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 Javascript
详解Node 定时器
Feb 26 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
Aug 11 Javascript
layui使用表格渲染获取行数据的例子
Sep 13 Javascript
前端vue+elementUI如何实现记住密码功能
Sep 20 Javascript
jquery实现拖拽小方块效果
Dec 10 jQuery
详解Ubuntu安装angular-cli遇到的坑
Sep 08 #Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
Sep 07 #Javascript
Bootstrap-table使用footerFormatter做统计列功能
Sep 07 #Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 #jQuery
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 #Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
Sep 07 #Javascript
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 #jQuery
You might like
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
JavaScript 变量命名规则
2009/09/23 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
python使用arcpy.mapping模块批量出图
2017/03/06 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
几个人围成一圈的问题
2013/09/26 面试题
外语专业毕业生自我评价分享
2013/10/05 职场文书
商场活动策划方案
2014/01/24 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
林肯就职演讲稿
2014/05/19 职场文书
表扬稿范文
2015/01/17 职场文书
教师个人发展总结
2015/02/11 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书