Vue 中的代理proxy配置

我们本地开发调试一般是 npm run serveyarn serve,然后打开 localhost:8080(本机的IP),此时如果调用后端接口,可能会产生跨域,那如何解决呢?

解决跨域的方案

  1. jsonp
    • 只支持GET请求,JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
  2. cors
    • CORS支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案
  3. Node中间件代理(两次跨域)
    • 通过同源策略对服务器不加限制。
  4. Nginx反向代理
    • 通过同源策略对服务器不加限制。

日常工作中,生产环境用得比较多的跨域方案是cors和nginx反向代理。
本地项目中调试用的最多的就是 node 代理,当然像 nginx、charles(抓包工具)做代理也可以,只要你会配置。

vue 中的 proxy 就是利用了 Node 代理,原理是因为服务器端没有跨域,使用的是 http-proxy-middleware 这个模块(这个模块相当于是node.js的一个插件)

案例

  1. 你要调取的接口是 http://dev.com/api/test,然后你可以在本地调 http://localhost:8080/api/test,如axios.get('/api/test')

配置代理后,会做如下转发:

http://localhost:8080/api/test -> http://dev.com/api/test
http://localhost:8080/admin/api/test -> http://dev.com/admin/api/test

1
2
3
4
5
6
7
8
9
10
11
// vue-cli3.0 里面的 vue.config.js做配置
devServer: {
proxy: {
'/api': {
target: 'http://dev.com',// 后端接口域名
ws: true,//如果要代理 websockets,配置这个参数
secure: false,// 如果是https接口,需要配置这个参数
changeOrigin: true,// 是否跨域
}
}
},
  1. 当你调后端接口的命名没有统一给接口前加 /api 这类的标识,那么你可以自己加,也就是你可以在本地调 http://localhost:8080/api/test,如axios.get('/api/test'),而你要的目标接口是 http://dev.com/test,你就可以用 pathRewrite,遇到 /api 就去找代理 http://dev.com/test 并且把 /api 重写为 /

所以转发效果就是:

http://localhost:8080/api/test -> http://dev.com/test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// vue-cli3.0 里面的 vue.config.js做配置
devServer: {
proxy: {
'/api': {
target: 'http://dev.com',// 后端接口域名
ws: true,//如果要代理 websockets,配置这个参数
secure: false,// 如果是https接口,需要配置这个参数
changeOrigin: true,// 是否跨域
pathRewrite:{// 路径重写
'^/api': '/'
}
}
}
},
  1. 对所有的接口都代理的,不止是检测到 /api 的接口,比如:

http://localhost:8080/api/test -> http://dev.com/api/test
http://localhost:8080/test -> http://dev.com/test

1
2
3
devServer: {
proxy: 'http:///dev.com'
}

常用的devServer配置

DevServer配置文档

  1. devServer.disableHostCheck

当设置为true时,此选项将绕过主机检查。不建议这样做,因为不检查主机的应用程序容易受到DNS重新绑定攻击。

1
2
3
devServer: {
disableHostCheck: true
}
  1. devServer.publicPath

假设服务器在http://localhost:8080下运行,output.filename设置为bundle.js。默认情况下,devServer.publicPath/,所以你的包可以作为http://localhost:8080/bundle.js 使用。将devServer.publicPath更改为 /assets/ 就变为 http://localhost:8080/assets/bundle.js

1
2
3
devServer: {
publicPath: '/assets/'
}

确保devServer.publicPath始终以正斜杠开头和结尾。

常用vue/cli3的配置

vue/cli3配置文档

坚持原创技术分享,您的支持将鼓励我继续创作!
0%