为何出现跨域问题以及解决办法

问题
我们本地调试一般都是 npm run serve,然后打开 本机ip:8080(localhost:8080)对吧,这时候我们要调接口调试,后端的接口的地址可能在测试环境,也可能是自己电脑的 ip,总之不是你的 lcoalhost:8080,那么你调接口就会产生跨域,那么怎么办呢?就需要proxy出场了。
首先,proxyTable是我们在本地开发环境中调试接口用的,目的是为了解决本地跨域的问题,在线上的生产环境是没用的!

本地代理是开发环境才会生效,打包为生产环境后会自动失效,打包之后会出现跨域,是因为后台接口服务没有配置响应头的跨域机制,以java为例(response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, client_id, uuid, Authorization")),当然,如果后台服务本身设计就是为了安全不开放跨域访问,那可以将打包之后的前端代码放在nginx内,并设置反向代理到对应的接口服务即可

问:
为什么开发阶段才需要解决跨域,项目发布到生产环境就proxy的配置就无效了?
答:
同源策略是浏览器需要遵循的标准,而如果是服务器向服务器请求就无需遵循同源策略。
一般前端项目最后都会打包到和接口地址相同的服务器上,此时同源不会出现跨域。并且,前端是无法解决真正的跨域问题的。proxy根本不能解决跨域,最终要跨域还是要后端配合。proxy只是前端在开发的时候,方便开发使用的东西而已,打包后就无效了。

vue-cli的proxyTable用的是http-proxy-middleware,它是http代理中间件,它依赖node.js,基本原理是用服务端代理解决浏览器跨域。
该中间件本质上是在本地开了一个服务器dev-server,所有的请求都通过这里转发出去,即把浏览器的发送请求代理转发到代理服务器上,再由代理服务器发送请求给目标服务器,从而解决跨域问题。

原理
vue 中的 proxy 就是利用了 Node 代理,原理还是因为服务器端没有跨域这一说嘛,也是用了这么一个插件 地址

跨域之proxyTable——在开发和生产环境的不同配置:
https://blog.csdn.net/bonjourjw/article/details/95058069

image.png
 // 如果你想看代理后的路径
        onProxyReq: function (onProxyReq, req, res) {
          console.log('原相对路径' + req.originalUrl, '代理相对路径:' + req.path)
          // 这里的输出是自己配的,就是说开发环境控制台看到的地址,proxy代理成的样子,打印:http://localhost:9528/dev-api/manage/tFmAuthPlan/query
          console.log('前端请求url', onProxyReq._headers.origin + req.originalUrl)
          // 代理配置的目标地址,打印: http://192.168.0.223:18181/ad2api/manage/tFmAuthPlan/query
          console.log(
            '目标请求url2',
            onProxyReq.agent.protocol + '//' + onProxyReq._headers.host + onProxyReq.path
          )
        }

个人理解proxyTable中跨域中pathRewrite的用法
问: proxyTable 里面的pathRewrite里面的 ,^/api 什么意思?
答: 用代理,首先你得有一个标识,告诉他你这个连接要用代理,不然的话,可能你的 html,css,js这些静态资源都跑去代理.所以我们只要接口用代理,静态文件用本地
'/api': 就是告诉node,我接口只要是 '/api' 开头的请求才用代理,所以你的接口就要这么写 /api/xx/xx,最后代理的路径就是http://xxx.xx.com/api/xx/xx。可是不对啊,我正确的接口路径里面没有/api啊,所以就需要 pathRewrite用'^/api'把'/api'去掉这样既能有正确标识,又能在请求接口的时候去掉api。

Node中间件代理(两次跨域)
代理服务器,需要做以下几个步骤:

  • 接受客户端请求 。

  • 将请求 转发给服务器。

  • 拿到服务器 响应 数据。

  • 将响应 转发给客户端。


    image.png

nginx反向代理
实现原理类似于Node中间件代理,需要你搭建一个中转nginx服务器,用于转发请求。

使用nginx反向代理实现跨域,是最简单的跨域方式。只需要修改nginx的配置即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,并且不会影响服务器性能。

实现思路:通过nginx配置一个代理服务器(域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。
配置nginx代理:https://blog.csdn.net/chpswg/article/details/105368938

————————————————

复习一下跨域的解决方案
jsonp
cors
Node中间件代理(两次跨域)
nginx反向代理

CORS支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案
JSONP只支持GET请求,JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
不管是Node中间件代理还是nginx反向代理,主要是通过同源策略对服务器不加限制。
日常工作中,用得比较多的跨域方案是cors和nginx反向代理
————————————————

vue项目打包后 使用nginx部署
https://blog.csdn.net/superKM/article/details/100148095

vue开发环境配置跨域,一步到位

我的写法总结:
①api.js:
如果后端做了跨域处理,则这里可以直接写成测试环境地址:

 axios.defaults.baseURL = 'http://xxx.xxxx.com:8897/filemanage';

如果跨域,可以在这里配置基础url,然后在vue.config.js里使用proxy反向代理

axios.defaults.baseURL =process.env.NODE_ENV === 'production' ? '/' : '/api/filemanage';

②vue.config.js

  devServer: {
    host: '0.0.0.0', //局域网和本地访问
    open: true,
    overlay: {
      warnings: false,
      errors: true,
    },
    proxy: {
      ['/api']: {
        target: 'http://xxx.xxxx.com:8897',
        changeOrigin: true,
        pathRewrite: {
          ['^/api']: '',
        },
      },
    },
  },

本地测试地址是没有含有api的,所有,pathRewrite进行重写地址,把api替换成空字符“ ”。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容