隐藏

如何真正理解用Nginx代理来解决同源策略

发布:2022/8/12 22:27:08作者:管理员 来源:本站 浏览次数:1816



经过对同源策略的了解,我们应该要消除对浏览器的误解,同源策略是浏览器做的一件好事,是用来防御来自邪门歪道的攻击,但总不能为了不让坏人进门而把全部人都拒之门外吧。没错,我们这种正人君子只要打开方式正确,就应该可以跨域。

下面将一个个演示正确打开方式,但在此之前,有些准备工作要做。为了本地演示跨域,我们需要:

1.随便跑起一份前端代码(以下前端是随便跑起来的vue),地址是http://localhost:9099。

2.随便跑起一份后端代码(以下后端是随便跑起来的node koa2),地址是http://localhost:9971。


解决同源策略


想一下,如果我们请求的时候还是用前端的域名,然后有个东西帮我们把这个请求转发到真正的后端域名上,不就避免跨域了吗?这时候,Nginx出场了。

Nginx配置


server{

   # 监听9099端口

   listen 9099;

   # 域名是localhost

   server_name localhost;

   #凡是localhost:9099/api这个样子的,都转发到真正的服务端地址http://localhost:9871

   location ^~ /api {

       proxy_pass http://localhost:9871;

   }    

}


前端就不用干什么事情了,除了写接口,也没后端什么事情了


// 请求的时候直接用回前端这边的域名http://localhost:9099,这就不会跨域,然后Nginx监听到凡是localhost:9099/api这个样子的,都转发到真正的服务端地址http://localhost:9871


fetch('http://localhost:9099/api/getFoo', {

 method: 'POST',

 headers: {

   'Accept': 'application/json',

   'Content-Type': 'application/json'

 },

 body: JSON.stringify({

   msg: 'hello'

 })

})


Nginx转发的方式似乎很方便!但这种使用也是看场景的,如果后端接口是一个公共的API,比如一些公共服务获取天气什么的,前端调用的时候总不能让运维去配置一下Nginx,如果兼容性没问题(IE 10或者以上),CROS才是更通用的做法吧。


同源策略限制下Dom查询的正确打开方式