必须使用add_header指令配合always参数在server或location块中配置csp,不可用ngx_http_addition_module——该模块仅能追加响应体内容,无法操作http头;且需重载配置才生效。

不能用 ngx_http_addition_module 动态追加 CSP 安全头。
这个模块根本做不到添加 Content-Security-Policy 头
ngx_http_addition_module 只负责在响应体(response body)的开头或结尾插入文本内容,比如加一段 HTML 注释、JS 脚本或统计代码。它不处理 HTTP 响应头(headers),完全无法修改、新增或覆盖像 Content-Security-Policy 这类关键安全头。
想加 CSP,必须用 add_header 指令——它工作在响应头层面,且需配合 always 参数才能覆盖 301/404/500 等非 2xx 响应。
负载均衡层加 CSP 的正确方式
在 Nginx 作为反向代理或负载均衡器时,应在 server 或 location 块中直接写 add_header,而不是依赖 addition 模块:
- 把 CSP 配置放在
server块顶层,确保所有路径继承 - 必须带
always:例如add_header Content-Security-Policy "default-src 'self'; script-src 'self'" always; - 避免写在
http全局块——宝塔面板不支持,且易被子配置覆盖 - 若后端应用已输出 CSP,Nginx 的
add_header会覆盖它(Nginx 不合并同名 header,只取最后一个)
为什么有人误以为 addition 模块能加 CSP?
混淆常来自两个点:
- 看到 “addition” 就联想到“添加 header”,但模块名中的 “addition” 特指 body 内容追加
- 试图用
add_before_body插入<meta http-equiv="Content-Security-Policy">—— 这种 meta 标签在多数现代浏览器中已被忽略,尤其对内联脚本、fetch 请求等无效,不能替代响应头
更可靠的安全头组合建议
除 CSP 外,负载均衡层应一并配置其他基础安全头,统一由 Nginx 输出:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;add_header X-Frame-Options "DENY" always;add_header X-Content-Type-Options "nosniff" always;add_header Referrer-Policy "strict-origin-when-cross-origin" always;
所有指令都需放在同一作用域(如 server 块),且每次修改后必须点击【重载配置】,仅保存不生效。










