最直接有效的方式是用Nginx sub_filter在反向代理层将响应体中http://替换为https://,需禁用gzip、设置sub_filter_types扩展类型、锚定src/href等属性精准替换,并启用upgrade-insecure-requests头兜底动态场景。

最直接有效的方式,是在 Nginx 反向代理层用 sub_filter 对响应体中的第三方 HTTP 链接做字符串替换,把 http:// 改成 https://,同时配合 upgrade-insecure-requests 响应头覆盖 JS 动态拼接等漏网场景。这不是“能不能做”的问题,关键是“换得全、不破格式、不被压缩绕过”。
必须关闭响应压缩
gzip 或 brotli 压缩后的响应是二进制流,sub_filter 完全无法识别和处理明文内容。只要后端返回了 Content-Encoding: gzip,所有替换都会失效。
- 在对应
location块中加gzip off;(最稳妥) - 或统一禁用代理层压缩:在
http或server块中设gzip off; - 避免依赖
gunzip on—— 兼容性差、性能开销大、且不能保证解压完整性
显式声明可处理的 MIME 类型
sub_filter 默认只作用于 text/html,但静态资源引用常出现在其他文本类型中,比如内联 JS、JSON 配置、CSS 文件甚至 HTML 注释里。
- 加上
sub_filter_types text/html text/javascript application/json text/css; - 若后端类型不规范,可用
sub_filter_types *;强制覆盖所有响应(对图片、PDF 等二进制内容无影响,仅多一次无效扫描) - 务必确保后端响应头含
Content-Type,如application/json; charset=utf-8
精准替换脚本与资源链接
不能简单全局替换 http://,否则会误伤 JSON 字段值、注释、URL 编码片段等。应锚定常见 HTML 属性上下文,提升安全性。
sub_filter 'src="http://' 'src="https://';sub_filter "src='http://" "src='https://";-
sub_filter 'href="http://' 'href="https://';(覆盖 CSS 中@import、等) - 必须配
sub_filter_once off;,否则只改第一个匹配项
补足 JS 动态拼接等盲区
前端用 document.write('<script src="'%20+%20protocol%20+%20'//cdn.com/a.js'></script>')</code>%20%E8%BF%99%E7%B1%BB%E6%96%B9%E5%BC%8F%E7%94%9F%E6%88%90%E9%93%BE%E6%8E%A5%E6%97%B6%EF%BC%8C<code>sub_filter</code>%20%E6%97%A0%E6%B3%95%E4%BB%8B%E5%85%A5%E3%80%82%E6%AD%A4%E6%97%B6%E9%9C%80%E6%B5%8F%E8%A7%88%E5%99%A8%E7%AB%AF%E8%87%AA%E5%8A%A8%E5%8D%87%E7%89%88%EF%BC%9A</p><ul>%0A%20%20<li>%E6%B7%BB%E5%8A%A0%E5%93%8D%E5%BA%94%E5%A4%B4%EF%BC%9A<code>add_header%20Content-Security-Policy%20" upgrade-insecure-requests>
<li>该标准由 W3C 定义,现代浏览器会将页面内所有 <code>http://</script> 资源请求自动改为 https://
sub_filter 形成互补:一个修静态 HTML,一个兜底动态行为











