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'`。这要求将每个内联 `