什么是跨域

跨域就是在一个域的文档或者脚本试图去请求另一个域的资源。我们通常说的跨域是由浏览器的同源策略限制的一类请求场景。

ps: 想对跨域知识有更多了解的可以进这里:对前端跨域方案的认知总结

为什么在nginx层解决

比如我们有如下的一个架构配置:
image.png

API 1~3 分别对应3个服务,然后如果我们的跨域配置在了3个服务上,第一个问题是不是相同的代码要重复写3次。再者就是如果再增加服务,或者其中一个服务改到了其他Nginx网关,这个时候有很大的可能还要去修改对应的跨域配置。所以放在nginx层解决,我们只需要调整代理的规则即可,服务器怎样调动都不需要去关心。

跨域的nginx配置

  • 最简单的解决办法

    1. location / {
    2. # 在现代浏览器中不是那么好用,尤其是非localhost的情况下。
    3. add_header Access-Control-Allow-Origin *;
    4. }
  • 通过添加header头 ```nginx

    主域名属于kaikeba.com的时候,设置allow_url变量

    if ($http_origin ~ (.*).kaikeba.com) { set $allow_url $http_origin; }

    检查请求类型

    if ($request_method !~* POST|GET|DELETE|PUT|OPTIONS) { return 403 }

Access-Control-Allow-Credentials为true的情况下,Access-Control-Allow-Origin必须是请求的域名才被允许跨域访问。

add_header Access-Control-Allow-Origin $allow_url; add_header Access-Control-Allow-Credentials true;

允许的请求头和请求方法

add_header Access-Control-Allow-Headers ‘Origin, Content-Type, Accept, Cookie, Set-Cookie, X-Requested-With, authorization’; add_header Access-Control-Allow-Methods ‘POST, GET, DELETE, PUT, OPTIONS’;

关于预检请求,直接返回200

if ($request_method = OPTIONS) { add_header Access-Control-Max-Age 3600; add_header Content-Length 0; add_header Content-Type ‘text/javascript, charset=utf-8’; return 200; } ```

  • 通过在对应的服务用nginx进行反向代理接口,并修改cookie中的domain信息,方便当前域的cookie写入,实现跨域登录。

    ps: 有兴趣的童鞋可以自己试一下,一般我们只需要关心第一种或者第二种就可以了。