浅谈 Vue 的跨域问题

Vue 跨域问题

今天一个小老弟在那问我,哥给我看看代码,接口都测试通过了,怎么前端拿不到后端的数据,控制台老是报这个错误“Access-Control-Allow-Origin”。这就是跨域的问题。

出现跨域问题的原因

由于浏览器的同源策略导致,是浏览器对 javascript 施加的安全机制。通俗的讲就是两个不在同一个域名端口上的项目,在想获取资源时,一方对另一方施加访问的限制。

这里拿aaa.com域名来举例,aaa.com对应的外网IP地址为199.6.7.2

URL 是否存在跨域
http://www.aaa.com/a.js
http://www.aaa.com/b.js
同一域名 不存在跨域
http://www.aaa.com/aaa/a.js
http://www.aaa.com/bbb/b.js
同一域名不同文件夹 不存在跨域
http://www.aaa.com:8080/a.js
http://www.aaa.com:8000/b.js
同一域名不同接口 存在跨域
http://www.aaa.com/a.js
https://www.aaa.com/b.js
同一域名不同协议 存在跨域
http://www.aaa.com/a.js
http://199.6.7.2/b.js
域名和对应域名的IP地址 存在跨域
http://www.aaa.com/a.js
http://son.aaa.com/b.js
同一域名不同子域 存在跨域
http://www.aaa.com/a.js
http://www.son.aaa.com/b.js
同一域名不同二级域名 存在跨域
http://www.aaa.com/a.js
http://www.bbb.com/b.js
不同域名 存在跨域

解决跨域

1. Vue解决

这是我们的前端项目地址:http://127.0.0.1:8080/

这是我们的后端接口地址:http://127.0.0.1:8000/

(1)在vue项目的根目录下,新建vue.config.js文件

(2)写入以下代码

module.exports = {
  // vue.js里解决跨域问题
  devServer: {
    proxy: {
      '/api': {
        target: 'http://127.0.0.1:8000/', // 目标地址
        changeOrigin: true,
        pathRewrite: {
          '^/api': '' // 需要重写的地址
        }
      }
    }
  }
}

说明:这里当前端访问到 /api 这个路径的时候,会将url代理到 http://127.0.0.1:8000/ 这个目标地址上,并将 /api 这个路径重写。

举个例子:这是我们后端提供的接口 http://127.0.0.1:8000/system/slider/list ,如果前端的axios直接访问这个接口的话,由于前端的端口是8080,后端的端口号是8000,会引起不同域名不同端口的跨域问题。于是,我们引入上面的代码段,让前端访问的接口改为 http://127.0.0.1:8080/api/system/slider/list 。这样前端访问的接口 http://127.0.0.1:8080/api 这一段url会代理到 http://127.0.0.1:8000 上,这样就满足了同源策略,因此解决跨域问题,接口得以正常访问。

2. Nginx解决

使用nginx作为代理服务器,这样用户只需要在80端口上进行前后端的交互,这样就能避免不同源的问题,因此来实现跨域。

(1)打开nginx.conf文件

(2)修改nginx配置为下面代码

server {
    listen 80;
        server_name 127.0.0.1;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }

    location ~ /api {
        proxy_pass http://127.0.0.1:8000;
    }
}

说明:Nginx监听80端口,将 http://127.0.0.1 的所有请求服务转发到127.0.0.1端口为8080;将 http://127.0.0.1/api 请求转发到 http://127.0.0.1:8000 上,nginx实现跨域的原理,实际上就是把web项目和后端接口项目放到同一个域中,这样满足同源的策略,然后根据请求地址去请求不同的服务器。

举个例子:当用户访问 http://127.0.0.1 这个地址时,会被nginx转发到 http://127.0.0.1:8080 这个地址上,这样就能访问到我们的前端项目;当用户想访问 http://127.0.0.1:8000/system/slider/list 这个接口时,就必须把接口url换个形式,用 http://127.0.0.1/api/system/slider/list 这个url来访问接口,让其接口请求转发到 http://127.0.0.1:8000/system/slider/list 这个接口url上。

如有不当之处,欢迎指正,谢谢!!!


如需转载,请加上本文的链接并标明出处

一条爱吃屎的狗:https://www.qnmlgb.top

你可能感兴趣的:(浅谈 Vue 的跨域问题)