详解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 相关文章推荐
对YUI扩展的Gird组件 Part-2
Mar 10 Javascript
基于jQuery的模仿新浪微博时间的组件
Oct 04 Javascript
Js 时间间隔计算的函数(间隔天数)
Nov 15 Javascript
js有关元素内容操作小结
Dec 20 Javascript
基于jquery点击自以外任意处,关闭自身的代码
Feb 10 Javascript
js显示文本框提示文字的方法
May 07 Javascript
使用CamanJS在Web页面上处理图像的技巧
Aug 18 Javascript
vue2.0中goods选购栏滚动算法的实现代码
May 17 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
Aug 30 Javascript
基于JS实现web端录音与播放功能
Apr 17 Javascript
vue实现分页的三种效果
Jun 23 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
Jul 28 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 无极分类(递归)实现代码
2010/01/05 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
php设计模式之单例模式使用示例
2014/01/20 PHP
Nginx实现反向代理
2017/09/20 Servers
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
python使用PyFetion来发送短信的例子
2014/04/22 Python
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
详谈python http长连接客户端
2017/06/12 Python
Python3处理HTTP请求的实例
2018/05/10 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
高中数学教师求职信
2013/10/30 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
供货协议书
2014/04/22 职场文书
微笑服务演讲稿
2014/05/13 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
施工安全责任协议书
2016/03/23 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python