必须使用map指令动态白名单匹配Origin,禁用通配符*;静态资源location中仅允许GET/HEAD/OPTIONS方法,预检请求返回204,并配合CSP、HTTPS等纵深防御措施。

静态资源本身不产生跨域问题,但当浏览器通过 JavaScript(如 fetch、XMLHttpRequest)请求这些资源时,若来源域名与当前页面不同,就会触发同源策略限制。Nginx 无法消除跨域概念,但能通过响应头控制浏览器是否允许跨域访问——关键在于:不盲目放行,而是按需、精准、最小权限地配置 CORS 策略。
避免通配符放行,动态匹配可信来源
直接设置 Access-Control-Allow-Origin: * 是高危操作,尤其当资源含敏感信息或支持凭据(Cookies)时。应使用 map 指令白名单匹配 Origin:
- 在
http块中定义可信域名映射:
default "";
"https://app.example.com" "$http_origin";
"https://admin.example.net" "$http_origin";
}
- 在静态资源 location 中引用:
alias /var/www/static/;
if ($cors_origin) {
add_header 'Access-Control-Allow-Origin' $cors_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Vary' 'Origin';
}
}
这样既支持多域名,又避免凭据泄露风险,且 Vary: Origin 确保 CDN 或代理缓存正确区分响应。
限制方法与头部,防止滥用预检请求
静态资源通常只读,无需 POST/PUT/DELETE。过度开放方法会增大攻击面:
- 仅允许安全方法:
add_header 'Access-Control-Allow-Methods' 'GET, HEAD, OPTIONS'; - 明确声明允许的请求头,避免暴露内部字段:
add_header 'Access-Control-Allow-Headers' 'Accept, Range'; - 为 OPTIONS 预检请求单独处理,快速返回 204,不穿透到后端:
add_header 'Access-Control-Max-Age' 86400;
add_header 'Content-Length' 0;
return 204;
}
配合其他安全头,构建纵深防御
CORS 不是孤立策略,需与传输与加载层协同:
- 强制 HTTPS:在 HTTP server 块中
return 301 https://$host$request_uri; - 注入 CSP,禁止内联脚本执行,阻断 XSS 利用跨域资源注入恶意逻辑:
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; img-src 'self' data:; font-src 'self';" always; - 禁用 MIME 类型嗅探:
add_header X-Content-Type-Options nosniff;,防止浏览器误解析 .js/.html 文件为可执行内容 - 防点击劫持:
add_header X-Frame-Options DENY;
隔离静态服务,缩小攻击面
不要把静态资源和 API 同一 location 处理。独立配置可精确控制行为:
- 用专用 server 块或 location 匹配静态路径(如
/assets/、/img/),关闭不必要的功能:autoindex off;、limit_except GET HEAD { deny all; } - 屏蔽危险路径:
location ~ \.(git|htaccess|log|bak|swp)$ { return 404; } - 对上传目录等高风险静态区域叠加 IP 白名单或 Referer 校验,例如:
valid_referers none blocked *.example.com; if ($invalid_referer) { return 403; }


















