【js】【跨域问题】先后端分离的跨域问题

最近在研究nodejs,php的先后端分离相关东西,在调用接口的时候碰到一些跨域的问题,通过一段时间的摸索,总结出来的一些东西php

php采用的是yii框架,登陆的机制或者调用接口都须要前端传递cookie进去,可是nodejsaxios接口等默认是不会传递cookie前端

  • 跨域解析:浏览器请求非本域名的网站资源,若是目标服务器没有设置跨域的状况下,浏览器是会阻止用户的请求的
  • 跨域的解决途径:能够配置后端服务转发的机制绕开跨域问题;也能够直接配置目标服务器的跨域配置

配置转发

搭建一个和前端处于同一域名下的代理服务器,代理服务器把前端的请求转发到真正的目标服务器,接收到的请求再转发给前端
这个通常都是在nginx,apache,iis里面进行转发的node

目标服务器的跨域配置

若是不配置代理服务器的话,那应该配置目标服务器的跨域配置了,若是是二次请求(第一次预请求OPTIONS方法,第二次真正请求GET/POST/PUT/DELETE)那应该配置nginx和后端(PHP/JAVA)代码响应了ios

### nginx 配置
location / {
   if ($request_method = 'OPTIONS') { 
       add_header Access-Control-Allow-Origin http://xc.com:9599; 
       add_header Access-Control-Allow-Headers *;
       add_header Access-Control-Allow-Methods POST,OPTIONS;
       add_header Access-Control-Allow-Credentials true;
       return 204; 
   }
   index  test.php ;
   autoindex  on;
   try_files $uri $uri/ /test.php?$args;               
}
//php配置 在返回的header里面添加相应头部  
header('Access-Control-Allow-Origin:http://frontend.com:9599');//允许跨域的前端站点
header('Access-Control-Allow-Headers:*');//允许传递的header
header('Access-Control-Allow-Credentials:true');//须要校验 配置此项结合NODEJS的配置项能够经过接口传递cookie
//nodejs 配置
const service = axios.create({
   baseURL: process.env.BASE_API, // api 的 base_url
   timeout: 5000, // 请求超时时间
   withCredentials: true // 容许携带cookie
})

先后端建议采用同域名不一样端口,这样避免不一样域名下cookie访问问题,配置Credentials是为了便于接口传递cookie,若是接口不用cookie能够不用配置此选项

相关文章
相关标签/搜索