不能。ngx_http_addition_module仅能向响应体增文本,无法设置HTTP头;CSP必须通过add_header指令在响应头中配置Content-Security-Policy,且需加always参数以确保非2xx响应也生效。

不能。ngx_http_addition_module 无法用于添加 CSP 策略。
addition 模块的作用范围有限
该模块仅能向响应体(response body)的开头或结尾注入纯文本内容,比如 HTML 注释、脚本片段或页脚说明。它不处理 HTTP 响应头(headers),而 CSP 必须通过 Content-Security-Policy 响应头生效。
常见误解是以为“在 HTML 前插入 meta 标签”就能替代 CSP 头——但浏览器明确要求:通过 <meta http-equiv="Content-Security-Policy"> 设置的策略,不支持部分关键指令(如 script-src 中的 nonce、hash、unsafe-eval,以及 frame-ancestors、report-uri 等),且优先级低于响应头,实际生产环境不可靠。
CSP 必须用 add_header 实现
正确方式是使用 Nginx 内置的 ngx_http_headers_module,通过 add_header 指令设置响应头:
- 确保在
http、server或location块中配置,例如:add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline';" always; - 务必加 always 参数,否则 304、404、500 等非 2xx 响应不会携带该头
- 注意继承规则:同一配置层级多个
add_header会覆盖上级;若需组合多个头,需在同一作用域内重复写
动态策略需配合变量或子请求(但不是 addition 模块)
如果需要“根据路径、用户角色或上游响应动态生成 CSP”,可结合以下机制:
- 使用
$arg_*、$http_user_agent等内置变量做简单条件判断(配合map指令预定义策略字符串) - 对高阶动态需求(如从鉴权服务获取策略),可用
auth_request+proxy_pass获取策略值,再通过add_header注入(需启用subrequest_output_buffer_size等配合) - 绝对不要尝试用 addition 模块拼接 meta 标签来“模拟”CSP——既无效,又破坏语义与兼容性
推荐的最小可行配置
在 server 块中直接启用严格基础策略:
add_header Content-Security-Policy "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; base-uri 'self'; form-action 'self';" always;
后续按需放宽:比如引入 CDN 字体,就追加 font-src 'self' https://fonts.googleapis.com;,而非改动模块选型。

















