跨域请求
Cross Origin Policy 是在浏览器实现的一个规则。这个规则规定不同源下的代码不可以访问比起的资源(包括网络请求,静态文件和本地缓存等)。对于是否同源的界定是:协议(http/https),域名和端口。三个之中任意一个不同都不能算做同源。同源限制是浏览器为了保证数据安全而实现的规则。试想一下不同源的网站可以随意的访问彼此的数据,就毫无隐私安全可言了。
实现跨域请求
Jsonp: 利用JS标签可以进行跨域请求的特性,将跨域请求的链接赋值给
script
标签的src
属性,同时在URL末尾添加callback
函数。当跨域请求完整之后,跨域的服务器会把JSON字符串包裹在回调函数中,即callback({...})
,然后返回到前端,浏览器收到之后会尝试将其转化成JavaScript执行。所以你只需要在全局中定义callback
函数就可以接受数据了。
缺点:只支持get
请求。需要后端的支持(返回函数的包裹等)。代码比较混乱。postMessage:主要用来支持前端不同页面(不同源)之间的信息交互。
CORS(Cross-Origin Resource Sharing): 跨域资源共享。这是比较标准的跨域解决方案。CORS允许跨域请求的前提是,当前域被目标域认可了(Access-Control-Allow-Origin)。如果当前域被目前域所认可,浏览器就会允许当前域读取返回的数据。
注意:无论当前域有没有被认可,请求(Get和Option)是一定会被发出的,也一定会接受到response
,只是不能读取而已。Nginx反向代理
Nginx反向代理实现跨域
反向代理
反向代理服务器的任务就是把接受到的请求再分派到其他的服务器中处理,处理完毕后再将结果返回,请求的一方并不知道最终是哪个服务器处理了自己的请求。反向代理一般被用来分流均衡。
实现跨域
跨域最主要的问题就是浏览器对来自不同源的response进行阻隔。那么你只要让浏览器相信请求的链接和当前域是同源的话,就可以解决跨域问题了。
所以我们可以给前端App添加Nginx配置,然后划分一个特定的子域名,例如/external_api/
,用来专门接受对外服务的请求,然后使用proxy_pass
将请求分发给外部的服务器,外部服务器处理完后将结果返回,Nginx在将结果当成自己处理的进行返回就可以了。所以这实际上也是绕开了同源规则的限制。
方法一: 为前端配置Nginx
这种方法是为前端应用配置Nginx,使得对前端的访问都先经过Nginx的处理和转发。这种方法有一个小缺点就是这个匹配对外请求的路径/external_api/
会占用前端的路径。
Nginx配置:
server {
location / {
# 正常匹配前端应用的页面资源。
root /html;
index index.html index.htm;
}
//自定义本地路径
location /external_api {
rewrite ^.+external_api/?(.*)$ /$1 break; # 删除自定义的前缀。
include uwsgi_params; # 包含参数。
proxy_pass http://www.target.com; # 分发到目标服务器。
}
}
方法二: 创建一个新的Nginx服务器
这种方法和上面一种的区别在于:Nginx和前端App是分开存在的。Nginx在匹配到 location /
的时候,会把请求转发到前端app,而不是指向本地路径。
Nginx配置:
server {
location / {
# 转发到前端。
proxy_pass http://www.front-end.com;
}
//自定义本地路径
location /external_api {
rewrite ^.+external_api/?(.*)$ /$1 break; # 删除自定义的前缀。
include uwsgi_params; # 包含参数。
proxy_pass http://www.target.com; # 分发到目标服务器。
}
}