Nginx 的 sub_filter 指令可动态替换 HTML 响应中的 HTTP 资源链接以解决混合内容警告,但仅适用于 text/html 等文本类型,需禁用 gzip、设置 sub_filter_once off 和 sub_filter_types,并配合 proxy_redirect 与 CSP 头完善修复。

使用 Nginx 的 sub_filter 指令可以在反向代理响应时动态替换 HTML 内容中的字符串,从而解决 HTTPS 页面中硬编码的 HTTP 资源(如 http://example.com/js/app.js)导致的混合内容(Mixed Content)警告问题。但需注意:它仅适用于文本响应(如 text/html),不处理 JS/CSS/JSON 等二进制或非 HTML 类型,且替换是纯字符串匹配,无 DOM 解析能力。
启用 sub_filter 并配置基础替换规则
Nginx 默认不启用 sub_filter,需在 location 块中显式开启,并确保响应未被压缩(因 gzip 会破坏文本流)。关键配置包括:
- 设置
sub_filter_once off:允许多次替换(默认只替换第一个匹配项) - 使用
sub_filter_types text/html:明确指定可处理的 MIME 类型(必要时可追加application/xhtml+xml) - 禁用 gzip 输出:
gzip off(或确保代理上游已关闭压缩) - 添加
sub_filter 'http://' 'https://'可全局将协议升级,但过于粗暴,易误伤
精准替换:限定域名 + 协议 + 路径前缀
直接替换 http:// 风险高(如 URL 中的 query 参数、注释、JS 字符串都可能被误改)。更安全的做法是锚定具体域名和路径结构:
sub_filter 'src="http://old.example.com/' 'src="https://new.example.com/';sub_filter 'href="http://old.example.com/css/' 'href="https://new.example.com/css/';- 对
、<script></script>、等标签的src/href属性做针对性替换 - 注意引号类型:HTML 中可能为双引号、单引号或无引号(后者难匹配,建议前端规范写法)
配合 proxy_redirect 和 header 修复完整链路
sub_filter 仅处理响应体,还需同步修正响应头中可能存在的硬编码地址:
- 用
proxy_redirect http://old.example.com/ https://new.example.com/;重写Location、Refresh等跳转头 - 用
proxy_set_header Host new.example.com;确保后端生成的绝对 URL 基于新域名 - 添加
Content-Security-Policy头(如upgrade-insecure-requests)作为兜底策略,提示浏览器自动升级资源请求
限制与替代方案提醒
sub_filter 是轻量级补救手段,有明显局限:
- 不支持正则表达式(Nginx 开源版),无法处理动态端口、子路径变化等场景
- 对内联 JS 中的字符串、base64 数据、CSS
url()不生效(除非显式写出完整 URL 字符串) - 响应体过大时性能下降,且可能破坏 UTF-8 多字节字符(需确认
sub_filter在对应 Nginx 版本中正确处理编码) - 长期应推动前端使用相对路径、协议相对 URL(
//example.com/js.js)或环境变量注入域名











