强制静态资源走HTTPS的关键是确保Nginx监听80端口并配置301重定向,同时避免前端硬编码HTTP路径,配合HSTS头及CDN正确透传协议头。

静态资源本身不决定是否走 HTTPS,关键在于它们被引用的协议和 Nginx 的响应控制。在已配置好 HTTPS 的前提下,“强制静态资源走 HTTPS”不是单独给图片/CSS/JS加跳转,而是确保所有 HTTP 请求都被拦截并重定向——包括对静态资源的请求。
确保 80 端口监听并启用 301 跳转
这是最基础也最关键的一步。Nginx 必须实际监听 80 端口,否则用户访问 http://example.com/logo.png 会直接失败(超时或 502),根本不会触发跳转。
- 检查配置中是否存在独立的
listen 80;server 块,且server_name与你的主域名一致 - 避免只写
listen 443 ssl;却漏掉 80 端口的监听块 - 终端执行
netstat -tlnp | grep ':80',确认 nginx 进程确实在监听本地 80 端口 - 若使用宝塔面板,进入「网站 → 设置 → 配置文件」,确认有类似以下结构:
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
避免静态资源路径被硬编码为 HTTP
即使 Nginx 跳转正常,如果 HTML 中的 <img src="http://example.com/xxx.jpg"> 是绝对 HTTP 地址,浏览器会先发一次 HTTP 请求,再被 301 重定向——多一次往返,还可能被中间设备拦截。
- 前端代码中尽量用协议相对地址:
src="//example.com/xxx.jpg",或更推荐的根相对路径:src="/static/xxx.jpg" - 后端渲染时,统一通过环境变量或配置生成 HTTPS 的资源 URL
- 检查构建产物(如 Vue/React 打包后的 index.html),确保 public 目录下的资源引用不含
http://
配合 HSTS 提升长期安全性
仅靠 301 跳转无法防止首次访问时的 HTTP 明文劫持。HSTS 告诉浏览器“以后只许用 HTTPS 访问这个域名”,包括所有子资源请求。
- 在 HTTPS 的 server 块中添加响应头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; - 注意:
preload表示申请加入浏览器 HSTS 预加载列表,需确保全站稳定支持 HTTPS 后再启用 - HSTS 生效后,用户即使手动输入
http://,浏览器也会自动改用 HTTPS 发起请求,静态资源自然也被保护
CDN 或反向代理场景下的注意事项
如果你的流量经过 CDN、WAF 或前置 Nginx 反代,那么宝塔或本机 Nginx 的 80 端口可能并未对外暴露——此时跳转规则不会生效。
- 方案一:在 CDN 控制台开启「强制 HTTPS」或「HTTP 回源跳转」功能(如 Cloudflare 的 “Always Use HTTPS”)
- 方案二:让 CDN 将原始请求协议(
X-Forwarded-Proto)透传给后端,并在 Nginx 中基于该头判断跳转(需额外配置) - 方案三:关闭 CDN 的 HTTP 回源,只允许其通过 HTTPS 回源到你的服务器,从源头杜绝 HTTP 流量


















