Nginx “Access-Control-Allow-Origin” 安全配置
以下是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。
(图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。