应在每个 server 块中独立配置安全响应头,如 add_header x-content-type-options "nosniff" always;,并按站点实际需求定制 csp、谨慎启用 hsts,确保 https 可用后再设置 max-age 与 includesubdomains。

想用 Nginx 通过域名区分多个站点,同时为每个站点单独配置安全响应头(如 X-Content-Type-Options、Strict-Transport-Security、Content-Security-Policy 等),关键在于:在每个 server 块中独立定义安全头部,避免全局覆盖或遗漏,并确保 HTTPS 和 HSTS 等策略与对应域名的实际部署场景匹配。
按域名划分 server 块,头部配置不共享
Nginx 的安全头部应在每个基于 server_name 的虚拟主机内显式设置,而不是放在 http 块里统一继承。否则,所有站点会强制套用同一套策略,可能引发 CSP 报错、HSTS 跨域误启用等问题。
- 每个站点使用独立的
server块,明确绑定域名(支持多域名,如server_name example.com www.example.com;) - 在该
server块内直接写add_header,例如:add_header X-Content-Type-Options "nosniff" always;<br> add_header X-Frame-Options "DENY" always;<br> add_header X-XSS-Protection "1; mode=block" always;
- 注意添加
always参数——它让响应头在 3xx/4xx/5xx 状态码下也生效,否则默认只作用于 2xx 响应
HTTPS 与 HSTS 需按站点启用,禁止跨域继承
Strict-Transport-Security(HSTS)具有强绑定性:浏览器收到后会强制后续请求走 HTTPS,且作用域由 includeSubDomains 和当前域名共同决定。若多个子域名共用一个 server 块或错误复用 HSTS 头,容易导致非 HTTPS 子站被锁死。
- 仅在已配置有效 TLS 证书并启用 HTTPS 的
server块中添加 HSTS:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; - 主站(example.com)启用了
includeSubDomains,就不要在 blog.example.com 的配置里再加一遍——它已被覆盖;但若 blog.example.com 是独立证书+独立 IP 或 CDN 接入,应单独验证其 HTTPS 可用性后再启用 - 上线前先用短
max-age(如 300)测试,确认无混合内容、跳转循环等问题,再逐步延长
CSP 策略必须按站点业务定制
Content-Security-Policy 不是“越严越好”,而是要匹配实际资源加载行为。同一个 CSP 规则套用到官网、后台、API 站点上,大概率导致样式丢失、脚本中断或图片不显示。
- 官网类站点常需:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; font-src 'self'; frame-ancestors 'none';" always; - 管理后台建议禁用
unsafe-inline,改用 nonce 或 hash(需后端配合注入) - 纯 API 服务(如 api.example.com)通常只需限制
default-src 'none',并放开connect-src 'self',无需script-src或style-src - 使用 CSP Evaluator 工具检查策略强度和潜在绕过风险
验证与维护要点
配置完成后不能只看 Nginx 启动是否成功,必须逐站点验证响应头真实生效,且逻辑自洽。
- 用
curl -I https://site.example.com检查各头部是否存在、值是否正确 - 访问站点后打开浏览器开发者工具 → Network → 查看任意请求的 Response Headers,确认无遗漏或被覆盖(尤其注意 404 页面是否也有安全头)
- 定期用 SecurityHeaders.com 扫描,它会给出分级评分和具体改进建议
- 更新证书、切换 CDN 或增加新子域时,同步复查对应
server块的安全头配置,避免“新增站点没加 HSTS”或“测试站误开了 preload”










