1chunghu/nginx-hardening-template

GitHub: 1chunghu/nginx-hardening-template

一份生产级 Nginx 静态站点安全加固配置模板,助力站点在 securityheaders.com 获得 A+ 评分且无需 unsafe-inline。

Stars: 0 | Forks: 0

# nginx-hardening-template 一个适用于静态网站的最简、经过生产环境测试的 nginx 配置,它在 [securityheaders.com](https://securityheaders.com) 上获得了 **A+** 的评分,并在 Lighthouse 中达到了 **100/100** —— 而且无需 `unsafe-inline` 脚本策略。 提取自真实的个人站点部署。放入目录中,替换掉 `example.com` 占位符,并根据你自己的源调整 CSP。 ## 它的功能 | 层级 | 防护措施 | |-------|---------| | 传输 | HSTS(1年),仅限 TLS 1.2/1.3,无弱密码套件 | | 框架 | `X-Frame-Options: DENY` + CSP `frame-ancestors 'none'`(防止点击劫持) | | 内容 | 严格的 CSP,**在 script-src 上没有 `unsafe-inline`** —— 这是核心目的 | | 嗅探 | `X-Content-Type-Options: nosniff` | | Referrer | `strict-origin-when-cross-origin` | | 功能 | `Permissions-Policy` 拒绝了相机 / 麦克风 / 地理位置 / USB / 支付 … | | 信息泄露 | `server_tokens off`(在 `Server:` 头中不显示版本号) | | Host 欺骗 | 通配的 `default_server` 在未知 Host 上返回 `444` | | 缓存 | 对带有版本号的资产进行 1 年的不可变缓存,对根资产进行 7 天缓存 | ## 两个不明显的坑 **1. 一旦某个 block 重新声明了 `add_header`,它就不再继承。** 在 nginx 中,一旦 `server` 或 `location` block 设置了*任何* `add_header`,它就会停止从 `http` block 中继承这些头。因此,站点 block 重新列出了完整的头部集合,而不是依赖继承——部分的列表会静默丢弃其余的头。这就是导致“我设置了 HSTS 但它在某些页面上丢失了”的最常见原因。 **2. 只有将内联代码外部化,才能移除 `unsafe-inline`。** A+ 评分取决于 `script-src 'self'` 且没有 `'unsafe-inline'`。这要求将每个内联 `