Nginx sub_filter 修正混合内容需满足四条件:启用指令、关闭压缩、扩展MIME类型、允许多次替换;精准匹配属性前缀避免误替;同步处理响应头、CSP策略及多域名映射。

在负载均衡层(如 Nginx 作为七层代理)用 sub_filter 修正 HTTPS 页面中第三方 HTTP 链接,核心是让浏览器不报“混合内容”警告。这不是改后端,而是在响应发出前做精准文本替换,关键在于“能替、替得准、不漏替、不误替”。
确保 sub_filter 能生效的基础条件
它只处理未压缩的文本响应,且默认仅对 text/html 生效:
- 必须显式启用:添加
sub_filter 'http://' 'https://';,否则不工作 - 关闭响应压缩:在对应
location块中加gzip off;或proxy_set_header Accept-Encoding "";,避免Content-Encoding: gzip导致替换失效 - 扩展 MIME 类型支持:用
sub_filter_types text/html text/css application/javascript application/json;,覆盖脚本、样式、内联配置等常见含链接的响应类型 - 允许多次替换:务必设
sub_filter_once off;,否则一个页面里只修第一个http://
提高替换精度,避开误伤陷阱
sub_filter 是纯字符串匹配,不解析 HTML 或 JS,所以边界控制特别重要:
- 优先匹配带属性前缀的写法,例如:
sub_filter 'src="http://' 'src="https://';sub_filter "src='http://" "src='https://";sub_filter 'href="http://' 'href="https://'; - 避免宽泛替换
http://,否则可能误改 JSON 字段名(如"http_status":200)、注释或 URL 中的子串(如https://example.com/http-api) - 若页面含大量内联 JS,可临时将该路径排除(用独立
location ~ \.html$块隔离),或配合add_header Content-Security-Policy "upgrade-insecure-requests";作为兜底
同步处理其他来源的 HTTP 地址
sub_filter 只动响应体,但混合内容还可能来自响应头或重定向:
- 用
proxy_redirect http:// https://;修正后端返回的Location头中的跳转地址 - 清理或重写敏感请求头,比如
proxy_set_header Referer "";,防止第三方因 Referer 被拒而降级回 HTTP - 添加
add_header Content-Security-Policy "upgrade-insecure-requests";,强制浏览器自动升级所有不安全资源请求,覆盖 JS 动态拼接等 sub_filter 无法触及的场景
应对多域名或路径映射的常见需求
当第三方资源需统一映射到当前域名下(如把 http://cdn.example.com 改成 /cdn/):
- 可链式配置多个
sub_filter,按从长到短顺序书写,例如:sub_filter 'src="http://cdn.example.com/js/' 'src="/cdn/js/';sub_filter 'src="http://cdn.example.com/' 'src="/cdn/'; - 注意斜杠方向和结尾:匹配
/static/比匹配/static更安全,避免命中/statics/ - 若目标含点号、下划线等字符(如
api.v2.example.com),直接照写,sub_filter 不涉及正则,无需转义

















