使用 Vue-cli 建立的项目,开发地址是 localhost:8080,须要访问非本机上的接口http://10.1.0.34:8000/queryRole。不一样域名之间的访问,须要跨域才能正确请求。跨域的方法不少,一般都须要后台配置,不过 Vue-cli 建立的项目,能够直接利用 Node.js 代理服务器,经过修改vue proxyTable接口实现跨域请求。在vue-cli项目中的config文件夹下的index.js配置文件中,修改前的dev:css
dev: { env: require('./dev.env'), port: 8080, autoOpenBrowser: true, assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: {}, cssSourceMap: false }
只要修改里面的proxyTable: {}项html
dev: { // 静态资源文件夹 assetsSubDirectory: 'static', // 发布路径 assetsPublicPath: '/', // 代理配置表,在这里能够配置特定的请求代理到对应的API接口 // 例如将'localhost:8080/api/xxx'代理到'www.example.com/api/xxx' // 使用方法:https://vuejs-templates.github.io/webpack/proxy.html proxyTable: { '/api': { target: 'http://xxxxxx.com', // 接口的域名 // secure: false, // 若是是https接口,须要配置这个参数 changeOrigin: true, // 若是接口跨域,须要进行这个参数配置,为true的话,请求的header将会设置为匹配目标服务器的规则(Access-Control-Allow-Origin)
pathRewrite: { '^/api': '' //自己的接口地址没有 '/api' 这种通用前缀,因此要rewrite,若是自己有则去掉
} } }, // 本地访问 http://localhost:8080 host: 'localhost', // can be overwritten by process.env.HOST
而后重启项目npm run devvue
注意:node
接口地址本来是 /save/index,可是为了匹配代理地址,在前面加一个 /api, 所以接口地址须要写成这样的便可生效 /api/save/index。webpack
'/api' 为匹配项,target 为被请求的地址,由于在 ajax 的 url 中加了前缀 '/api',而本来的接口是没有这个前缀的,因此须要经过 pathRewrite 来重写地址,将前缀 '/api' 转为 '/'。若是自己的接口地址就有 '/api' 这种通用前缀,就能够把 pathRewrite 删掉。ios
一、参数proxyTable详解:nginx
vue-cli的config文件里的参数:proxyTable,这个参数主要是一个地址映射表,你能够经过设置将复杂的url简化,例如咱们要请求的地址是api.xxxxxxxx.com/list/1
,能够按照以下设置:git
proxyTable: { '/list': { target: 'http://api.xxxxxxxx.com', pathRewrite: { '^/list': '/list' } } }
这样咱们在写url的时候,只用写成/list/1
就能够表明api.xxxxxxxx.com/list/1
.
那么又是如何解决跨域问题的呢?其实在上面的'list'
的参数里有一个changeOrigin
参数,接收一个布尔值,若是设置为true,
那么本地会虚拟一个服务端接收你的请求并代你发送该请求,这样就不会有跨域问题了,固然这只适用于开发环境。增长的代码以下所示:github
proxyTable: { '/list': { target: 'http://api.xxxxxxxx.com', changeOrigin: true, pathRewrite: { '^/list': '/list' } } }
vue-cli的这个设置来自于其使用的插件http-proxy-middlewareweb
github:https://github.com/chimurai/http-proxy-middleware
深刻了解的话能够看该插件配置说明,彷佛还支持websocket,很强大的插件。
二、pathRewrite含义:
用代理,首先你得有一个标识,告诉他你这个链接要用代理,否则的话,可能你的 html,css,js这些静态资源都跑去代理。因此咱们只要接口用代理,静态文件用本地。'/iclient': {}
, 就是告诉node
,我接口只要是'/iclient'
开头的才用代理。因此你的接口就要这么写 /iclient/xx/xx
。最后代理的路径就是 http://xxx.xx.com/iclient/xx/xx
。但是不对啊,我正确的接口路径里面没有/iclient
啊,因此就须要pathRewrite,
用'^/iclient':''
, 把'/iclient'
去掉,这样既能有正确标识,又能在请求接口的时候去掉iclient
。固然若是自己的接口中就有/iclient,那么就能够把pathRewrite这个参数去掉。
设置nginx配置文件:
location /api { add_header 'Access-Control-Allow-Origin' '*'; proxy_pass http://fanyi.baidu.com/v2transapi; }
日常咱们团队开发时都在公司的局域网内,调用接口也是局域网内部的,可是项目上线时,请求接口是线上服务器端的,那么就有接口之间的来回切换问题。
在使用vue-cli搭建项目之后,作相关配置就能够实现,不用手动更改接口路径,也能够请求不一样环境下的接口。
一、设置不一样的接口地址
先找到如下文件
/config/dev.env.js
/config/prod.env.js
能够看到dev.env.js里面内容以下
这是生产环境的参数配置,而后咱们能够再上面文件加入一行代码,以下:这就是本地测试环境请求后台接口的域名
而后找到prod.env.js文件,以下:
咱们加入一行代码,以下:这是咱们上传服务器之后,请求后台接口的域名
二、在代码中调用设置好的参数:
好比我在本项目中从新封装axios(api文件在/src/api/index.js中),将配置好的接口地址做为baseURL拼接到接口路径中,应用参数部分以下:
最后从新启动项目就能够了,当npm run dev的时候就运行在生产环境,当npm run build的时候就是正式的线上环境。
后端程序代理
有一种方法不需要后端的配合和修改服务器配置 ,咱们本身就能够作到。就是咱们本身启一个后端程序作代理。而后把全部的请求转发到服务器。这里要用到node的一个包http-proxy-middleware。关键代码(express)以下