详解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 相关文章推荐
Javascript 检测键盘按键信息及键码值对应介绍
Jan 03 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
Apr 10 Javascript
jQuery实现精美的多级下拉菜单特效
Mar 14 Javascript
即将发布的jQuery 3 有哪些新特性
Apr 14 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
JS实现页面跳转参数不丢失的方法
Nov 28 Javascript
js仿微信语音播放实现思路
Dec 12 Javascript
红黑树的插入详解及Javascript实现方法示例
Mar 26 Javascript
jQuery pager.js 插件动态分页功能实例分析
Aug 02 jQuery
微信小程序实现传递多个参数与事件处理
Aug 12 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
Aug 14 Javascript
Vue实现菜单切换功能
Nov 08 Javascript
详解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
使用PHP遍历文件目录与清除目录中文件的实现详解
2013/06/24 PHP
php日历制作代码分享
2014/01/20 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
推荐11个实用Python库
2015/01/23 Python
python提取字典key列表的方法
2015/07/11 Python
基于Python的Post请求数据爬取的方法详解
2019/06/14 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python3实现带多张图片、附件的邮件发送
2019/08/10 Python
如何基于python操作json文件获取内容
2019/12/24 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
搬家公司的创业计划书
2014/01/01 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
上班迟到检讨书
2014/09/15 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL