作用:
1.解决开发环境跨域问题(不用再去配置nginx和host)
2.如果你有单独的后端开发服务器API,并希望在同域名下发送API请求,那么代理某些URL会很有用
下面介绍一下五种经常使用的场景
使用场景一:
请求到 /api/xxx 现在会被代理到请求 http://localhost:3000/api/xxx, 例如 /api/user 现在会被代理到请求 http://localhost:3000/api/user
- module.exports = {
-
- //...
-
- devServer: {
-
- proxy: {
-
- '/api': 'http://localhost:3000'
-
- }
-
- }
-
- };
使用场景二
多个前缀的路径,都用一个路径来代理,使用context属性
- module.exports = {
-
- //...
-
- devServer: {
-
- proxy: [{
-
- context: ['/auth', '/api'],
-
- target: 'http://localhost:3000',
-
- }]
-
- }
-
- };
使用场景三
将url中的 /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,需要配置。默认情况下,不接受运行在 HTTPS(超文本传输安全协议) 上,且使用了无效证书的后端服务器。
- module.exports = {
-
- //...
-
- devServer: {
-
- proxy: {
-
- '/api': {
-
- target: 'https://other-server.example.com',
-
- secure: false//是否验证SSL Certs
-
- }
-
- }
-
- }
-
- };
使用场景五:
个人理解:如果想要请求静态html页面,绕过代理;对于api请求则保持代理
有时你不想代理所有的请求。可以基于一个函数的返回值绕过代理。
在函数中你可以访问请求体、响应体和代理选项。必须返回 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,
-
- }
-
- }
-
- }
-
- };
个人理解:这个配置文件会生成一个代理服务器,用于连接前端请求,向后端api服务器发送请求
修改 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配置访问代理服务器接受访问的ip地址的范围
- //localhost只可以在本地访问;如果是0.0.0.0,同一个网段都可以 //访问。
- //host: 'localhost', // can be overwritten by process.env.HOST
- //可以用process.env.PORT重写,如果接口被占用,会分配一个其他端口
-
- 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字符串
-
- 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