最稳妥的方式是在 nginx 的 location 块中用 add_header 指令配置 csp,并配合 always 参数确保错误页也生效;需按路径分层设置策略,如 /static/ 用 default-src 'none' 等精细化规则,并同步启用 x-content-type-options、x-frame-options 等关键安全头,上线前须先用 report-only 模式观察违规行为。

直接在 Nginx 的 location 块里用 add_header 指令写入 Content-Security-Policy,是最常用、最可控的方式。CSP 不是“开箱即用”的开关,它需要结合资源类型、加载方式和业务逻辑来定制策略,否则容易导致 JS 失效、样式丢失或图片不显示。
明确 CSP 放在哪一级配置更稳妥
不要一股脑塞进 http 块做全局统一;不同路径安全需求不同——比如 /static/ 只需加载同源资源,而 /admin/ 可能要嵌入 iframe,/uploads/ 则必须禁止执行脚本。推荐分层设置:
-
server块设基础策略(覆盖主站大部分页面) -
location块按需细化(如静态资源目录、上传目录、API 路径) - 所有
add_header后加always参数,确保 4xx/5xx 错误页也带上 CSP
静态资源专用的 CSP 示例(适用于 /static/ 或根路径)
location / {
root /var/www/static;
try_files $uri =404;
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;
}
说明:
-
default-src 'none'是起点,强制你显式声明每类资源来源,避免遗漏 -
script-src 'self'禁止内联脚本和远程 JS,适合纯静态 HTML + 外链 JS 的场景 -
style-src 'self' 'unsafe-inline'允许<style></style>标签,因多数 CSS 框架(如 Bootstrap)依赖它 -
img-src 'self' data:支持本地图片和 base64 图标,不放行外部图床 -
connect-src 'self'阻止前端向非同源地址发请求,防敏感 API 地址泄露
配合其他关键安全头一起启用
CSP 单独作用有限,建议同步加这些响应头:
-
X-Content-Type-Options: nosniff—— 防止浏览器 MIME 类型猜测执行恶意脚本 -
X-Frame-Options: DENY—— 禁止被 iframe 嵌入,防点击劫持 -
Strict-Transport-Security: max-age=31536000; includeSubDomains—— 强制 HTTPS,防止降级攻击 -
Referrer-Policy: strict-origin-when-cross-origin—— 控制 Referer 发送范围,避免敏感路径泄露
上线前必须做的两件事
- 先用
Content-Security-Policy-Report-Only替换Content-Security-Policy,把违规行为发到report-uri或report-to,观察 3–7 天,确认无误再切正式策略 - 检查是否所有静态资源(JS/CSS/字体/图片)都放在
root指向的目录下,且没有.git、.bak、.log等敏感文件暴露在可访问路径中
不复杂但容易忽略











