vue跨域配置解析
前言
跨域
这个问题其实老生常谈了,简单来讲就是,浏览器由于同源策略
规定,AJAX请求只能发给同源的网址,否则就报错。
所谓同源
,就是域名、协议、端口相同。
同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。
举个例子
我们请求一下百度首页:
1 | this.$axios.get("https://www.baidu.com") |
然后,浏览器检查一下控制台,报错情况如下:
1 | Access to XMLHttpRequest at 'https://www.baidu.com/' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. |
虽然报错了,但是浏览器其实是获取到数据的,只不过这样报错,不显示数据。
接下来让我们解决这个问题。
Vue2
配置BaseUrl
首先在main.js
中,配置下我们访问的Url前缀:
1 | import Vue from 'vue' |
关键代码是:Axios.defaults.baseURL = '/test'
,这样每次发送请求都会带一个/test
的前缀。
配置代理
修改config
文件夹下的index.js
文件,在proxyTable
中加上如下代码:
1 | '/test':{ |
这段代码,vue-cli
启动了http-proxy-middleware
代理服务。
第一个/test
,相当于是当请求链接遇到/test
时,会将/test
拼接到target
的链接下,比如我们在写axios
请求的时候,只用写成/test/1
就可以代表https://www.baidu.com/test/1
。
1 | // 举例 原先的请求 |
然后就是pathRewrite
起作用了,它能够用正则匹配到相应的字符段,然后进行路径替换,将前者替换为后者,这里看个人习惯来命名参数。也就是说pathRewrite
起重新加工处理的作用。
1 | // 代理后的请求 |
如果想了解更多关于pathRewrite
参数的讲解和实例,可以看看这里
http-proxy-middleware中的pathRewrite
修改请求Url
1 | this.$axios.get("/") |
重启服务
ctrl + c
终端后,再重新启动一下,就OK了,就能够正常请求到了。
这是控制台打印出来的内容:
1 | {data: "<!DOCTYPE html><!--STATUS OK-->\n\n\n <html><head>…5a9387c5b.js\"></script>\n</body>\n \n\t</html>", status: 200, statusText: "OK", headers: {…}, config: {…}, …} |
Vue3
基本上跟vue2一样,只是配置代理的时候有点不同。
配置代理
由于vue3
删除了config
文件夹,所以没了对应的index.js
文件,因此我们要自己新建一个config
文件。
在项目根目录下新建一个vue.config.js
文件,添加基础内容如下:
1 | module.exports = { |
修改devServer
下的proxy
:
1 | proxy: { |