多域名跨域

注意事项

1. 跨域本身只能配置允许一个或所有域名跨域,无法指定多个域名跨域,因此需要借助Nginx进行动态域名跨域配置;

2. 当配置 Access-control-allow-credentials true 时,则跨域配置中的 Origin 和 Headers 不能设置为“*”;

3. 配置反向代理跨域时,必须在跨域配置后加“always”,否则当代理服务器的HTTP请求状态码为40X、50X等时,Nginx默认不会设置跨域请求头,从而导致代理服务器的40X、50X等错误页面报跨域错误;在响应头字段后添加关键字always,用于告诉Nginx任何情况下都要添加响应头字段;


Nginx跨域配置

# 多域名跨域,根据来访域名动态设置允许跨域的域名 ---------------------------------
set $cors_origin "";
if ($http_origin ~* "demo.cn") {
   set $cors_origin $http_origin;
}
if ($http_origin ~* "demo.top") {
   set $cors_origin $http_origin;
}
if ($http_origin ~* "demo.vip") {
   set $cors_origin $http_origin;
}
   
# 当Access-control-allow-credentials为true时,再设置其它跨域项目为"*"时,将可能跨域失败
# 当HTTP请求状态码为40X、50X等时,Nginx默认不会设置跨域请求头;如下,在响应头字段后添加关键字always,用于告诉Nginx任何情况下都要添加响应头字段;
add_header Access-Control-Allow-Origin $cors_origin always;  # 动态跨域 
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS' always;
add_header Access-Control-Allow-Headers 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With' always; # 允许所有请求头
add_header Access-Control-Max-Age 3600 always;    # 预检命令的缓存,如果不缓存每次会发送两次请求
add_header Access-control-allow-credentials true always;
# 请求为OPTIONS预检时,直接返回
if ($request_method = OPTIONS ) {
    return 204;
}    
举报

© 著作权归作者所有


1