目前后端都是在自己「服务」中,通过拦截「OPTIONS」请求,返回跨域信息。这种方式有几点局限:
新建一个服务,需要把之前项目中写的拦截器copy过来,并做简单的配置。虽然不复杂,但繁琐。
对「OPTIONS」请求,增加或修改某些字段,需要「变更所有涉及到跨域的服务」并且「发布上线」。
每次请求「OPTIONS」 ,都需要经过「服务」,简单返回「204」和「一些协议头」并没有任何复杂逻辑,反而占用一个多余请求,对「后端服务」是一种浪费。
而使用 Nginx 处理,是在合适不过了。统一在 Nginx 前面拦截,后面所有的「服务」都能支持跨域,并且响应会很快,不浪费后端「服务」请求。
下面两种方式,从根本上是一样的,只是受限于配置方式,所以写了两种。
方法一:Ocean 配置
在 Ocean 中配置如下代码,只能通过UI操作,写在一行,很不好用。
if ($request_method = 'OPTIONS') {
add_header Access-Control-Max-Age 600;add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';add_header Access-Control-Allow-Headers $http_access_control_request_headers;add_header Access-Control-Allow-Credentials true;add_header Access-Control-Allow-Origin $http_origin;return 204;
}
方法二:直接修改Nginx 配置文件
set $cors '';
# 在这里可以配置允许跨域的白名单
if ($http_origin ~* (https?://(.+\.)?(domain1|domain2|domain3)\.(?:me|co|com)$) ) {
set $cors 'true';
}
if ($request_method = 'OPTIONS') {
# 这些信息一定放到 OPTIONS 中,不能为了省事,所有请求都加,这信息只对 OPTIONS 有效
if ($cors = 'true') {
add_header Access-Control-Allow-Origin $http_origin;
}
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
add_header Access-Control-Max-Age 600;
add_header Vary 'Origin';
return 204;
}
参考: