Nginx 中配置 upgrade-insecure-requests 需在 HTTPS server 块内用 add_header 添加 CSP 头,合并已有策略,配合 80 端口 301 跳转,并确保资源支持 HTTPS 或通过 proxy_pass 代理。

在 Nginx 中配置 Content-Security-Policy 强制升级 HTTP 请求,核心是启用 upgrade-insecure-requests 指令。它让浏览器自动把页面中所有 http:// 子资源请求(如图片、脚本、CSS、API)升级为 https://,无需改动前端代码。
只在 HTTPS server 块中添加响应头
该策略仅对 HTTPS 页面生效,必须放在 listen 443 ssl 的 server 块内,不能加在 HTTP(80 端口)配置中:
- 推荐写法(带
always参数,确保 304 或错误响应也携带):add_header Content-Security-Policy "upgrade-insecure-requests" always; - 若已存在其他 CSP 头,需合并而非覆盖,例如:
add_header Content-Security-Policy "upgrade-insecure-requests; default-src 'self'; img-src * data:; connect-src 'self';"; - 避免写成
upgrade-insecure-requests off或放在 http {} 全局块——这会禁用功能或完全不生效
确保资源可被 HTTPS 正确访问
浏览器升级后仍需目标地址实际支持 HTTPS,否则请求会失败:
- 同域名资源(如
http://yoursite.com/logo.png)升级后变为https://yoursite.com/logo.png,只要你的 HTTPS 服务能响应该路径即可 - 第三方 HTTP 接口(如
http://api.example.com/data)升级为https://api.example.com/data,前提是对方已部署有效 HTTPS 服务,且配置了正确 CORS 响应头 - 若后端确实无 HTTPS(如内网 HTTP API),建议配合
proxy_pass反向代理,在 Nginx 层“对外 HTTPS,对内 HTTP”
配合强制跳转堵住 HTTP 入口
仅靠 CSP 升级不够彻底,用户仍可能通过 http:// 直接访问,导致初始页面加载为 HTTP,CSP 不触发:
- 在 80 端口 server 块中加 301 跳转:
return 301 https://$host$request_uri; - 确保 SSL 证书已正确配置,且域名解析和证书覆盖范围匹配(含 www / 非 www)
- 上线前可用 curl -I http://your.com 验证是否返回 301 + Location: https://…
前端兜底:HTML meta 标签(备用方案)
当无法修改 Nginx 配置(如托管在某些静态平台),可在 HTML 的 中加入:
注意:该方式只对当前 HTML 文档生效,不作用于动态插入的 iframe、Web Worker 或 fetch 调用中的子资源。


















