场景模拟,现在只允许所有的 a.com 和b.com 的跨域请求
一、nginx直接处理options请求(跨域预检)
nginx直接返回options请求的优点
1、可以在nginx层面控制options配置,方便管理
2、在nginx处理可以减少后端服务器的压力
location 下使用set if 匹配options 返回对应的请求头
set $cors_origin "";
if ($http_origin ~* ^https?://(.*\.)?(a.com|b.com)) {
set $cors_origin $http_origin;
}
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin $cors_origin;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods GET,HEAD,POST,OPTIONS;
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
add_header Allow GET,HEAD,POST,OPTIONS;
add_header Access-Control-Max-Age 3600;
return 200;
}
二、nginx在上游响应的头部增加跨域的请求头
location 下匹配域名增加对应域名的请求头
if ($http_origin ~ ^https?://(.*\.)?(a.com|b.com)){
add_header Access-Control-Allow-Origin $http_origin;
}
三、全局使用map 声明跨域的返回值(这个可以更加灵活的使用变量和nginx别的配置)
map配置声明cors_origin 的值,需要结合别的配置增加跨域请求头的配置
map $http_origin $cors_origin {
default "";
^https?://(.*\.)?(a.com|b.com) $http_origin;
}