cros和nginx反向代理是解决跨域的两种常用方案。
cros
出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。cros使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源
在前后端分离的情况下,开发中前端会单独占用一个端口比如localhost:8080,后端localhost:3000,ajax请求必然会跨域,如果涉及cookie等(跨域请求浏览器不会携带cookie信息),ajax的withCredentials设置为true。
服务器端设置:
//如果携带cookie信息,则Access-Control-Allow-Origin 不能设置通配符*
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
如果服务端使用的是koa框架,koa-cors包是专门用于配置跨域的,前端在axios中配置withCredentials请求头
nginx反向代理
nginx反向代理的原理是nginx服务器(localhost:80)转发所有的请求给前端服务器(localhost:8080)和后端服务器(localhost:3000),我们只访问localhost:80服务器,前端代码中的ajax请求也是请求localhost:80服务器,此时相当于所有资源都是同源的,不存在跨域问题。
# nginx配置
location / {
proxy_pass http://127.0.0.1:8080;
}
location /ajax/ {
proxy_pass http://127.0.0.1:3000;
}
location /images/ {
proxy_pass http://127.0.0.1:3000;
}