Cross Origin Resouce Sharing
by bugnofree
Publish → 2020-05-28 Update → 2020-05-28

跨域基本概念

在 CORS 中, 以三元组  <协议, 二级域, 端口>  唯一标记一个访问域,当三元组中的任意一个发生变化时, 就发生了跨域. 协议比较好理解, 比如 http, https等, 二级域就是紧接着顶级域后的域, 比如  ahageek.com  其顶级域是  com , 二级域就是  ahageek , 端口也比较好理解, 就不说了.

浏览器中 CORS 分为两类: 简单请求和非简单请求.

不管哪种方式, 只要服务器允许跨域, 响应头中必定包含 Access-Control-Allow-Origin 字段,在该字段中指明允许的源.

解决跨域问题

在写前端的时候, 通常会遇到跨域问题, 一个比较通用的方法是使用 nginx 反向代理,在 nginx 配置文件目录中添加如下配置文件

server {
    listen  3456;
    server_name _;
    client_max_body_size 200M;
    location ~ /api/ {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

            if ($request_method = 'OPTIONS') {
                return 204;
            }
            rewrite ^/api/(.*)$ /$1  break;
            proxy_pass http://127.0.0.1:1024;
    }
}

假设你服务器地址为 <IP> 那么访问  <IP>:3456/api  就相当于访问内网  http://127.0.0.1:1024 .

这里有一个地方要注意就是设置 nginx 的 client_max_body_size 的大小, 默认情况下为 1M, 如果你要上传文件超过了 1M, 那么也会出现 CORS 访问错误, 这个是个坑, 需要注意.