以下是Nginx中安全配置“Access-Control-Allow-Origin”头的实践指南:
一、避免使用通配符(*)
1. 精确指定允许的域名
通过白名单限制允许跨域的域名,避免使用Access-Control-Allow-Origin *,以减少CSRF等安全风险。
示例:
add_header Access-Control-Allow-Origin "https://example.com";
2. 动态匹配多个域名
使用map模块根据请求的Origin动态返回允许的域名,提升灵活性:
map $http_origin $cors_origin {
default "";
"~^https?://(example\.com|sub.example\.net)$" $http_origin;
}
server {
location / {
add_header Access-Control-Allow-Origin $cors_origin;
}
}
二、限制允许的HTTP方法及头部
1. 明确允许的请求方法
仅开放必要的HTTP方法(如GET, POST),而非默认允许所有方法:
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
2. **指定允许的请求头**
按需开放自定义或敏感头部(如Authorization),避免泛用配置:
```nginx
add_header Access-Control-Allow-Headers "Content-Type, Authorization";
三、预检请求(OPTIONS)处理
1. 返回204状态码
对OPTIONS请求直接返回204 No Content,避免触发实际业务逻辑68:
if ($request_method = 'OPTIONS') {
return 204;
}
2. 避免重复添加头信息
确保在错误处理块(如error_page
)中不重复设置跨域头,防止响应头冲突。
四、增强安全性补充配置
1. 控制凭据访问
若需携带Cookie等凭证,需显式设置Access-Control-Allow-Credentials
并禁用通配符:
add_header Access-Control-Allow-Credentials "true";
2. 限制缓存时间
通过Access-Control-Max-Age
减少预检请求频率,但需根据业务需求设置合理有效期(单位:秒):
add_header Access-Control-Max-Age 3600;
3. 添加Vary头
避免缓存因Origin
不同导致的错误响应:
add_header Vary "Origin";
五、完整配置示例
map $http_origin $cors_origin {
default "";
"~^https?://(example\.com|sub.example\.net)$" $http_origin;
}
server {
location / {
if ($cors_origin) {
add_header 'Access-Control-Allow-Origin' $cors_origin;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Vary' 'Origin';
}
if ($request_method = 'OPTIONS') {
return 204;
}
}
}
以上配置通过动态域名匹配、严格限制方法/头部、正确处理预检请求及补充安全头,实现既灵活又安全的CORS策略15。