nginx sub_filter可修复混合内容,需关闭gzip或启用gunzip、显式设置sub_filter_types、精准匹配src/href属性中的http://、禁用etag并关闭sub_filter_once。

使用 Nginx 的 sub_filter 指令可以在反向代理响应体中批量替换文本,从而将 HTTP 资源链接自动升级为 HTTPS,解决混合内容(Mixed Content)问题。但需注意:它仅适用于纯文本响应(如 text/html),且不处理内联脚本或动态生成的 URL。
确保 sub_filter 生效的基本前提
sub_filter 默认只对 text/html 类型响应生效,且要求响应未被压缩(gzip)。若后端返回了 Content-Encoding: gzip,Nginx 不会解压并修改响应体 —— 此时替换失效。
- 关闭后端的 gzip 压缩,或在 Nginx 中配置
gzip off;或gunzip on;(需编译时启用ngx_http_gunzip_module) - 显式设置
sub_filter_types text/html application/xhtml+xml;以支持常见 HTML 变体 - 确认响应头中
Content-Type确实包含text/html,可用curl -I验证
精准替换不安全的 script src 和 link href
直接全局替换 http:// 风险高(可能误改 JSON、注释、URL 参数等)。应聚焦于 HTML 标签属性中明确的资源引用:
- 替换
<script src="http://%20%E2%86%92%20<script%20src=" https:></script> - 替换
<link rel="stylesheet" href="http://%20%E2%86%92%20<link%20rel=" stylesheet http: src="https://';
%0A%20%20sub_filter%20'<link%20href="> <br><code>sub_filter 'href="http://' 'href="https://'; - 若页面含大量 JS 动态加载逻辑(如
document.write('<script src="http://...')%20%EF%BC%89%EF%BC%8Csub_filter%20%E6%97%A0%E6%B3%95%E8%A6%86%E7%9B%96%EF%BC%8C%E9%9C%80%E5%89%8D%E7%AB%AF%E4%BF%AE%E5%A4%8D %0A
%E5%90%AF%E7%94%A8%E6%9B%BF%E6%8D%A2%E5%B9%B6%E9%98%B2%E6%AD%A2%E7%BC%93%E5%AD%98%E5%B9%B2%E6%89%B0
%0Asub_filter%20%E4%BF%AE%E6%94%B9%E5%93%8D%E5%BA%94%E4%BD%93%E5%90%8E%EF%BC%8C%E5%8E%9F%E5%A7%8B%20ETag%20%E6%88%96%20Last-Modified%20%E5%A4%B4%E5%B7%B2%E5%A4%B1%E6%95%88%EF%BC%8C%E5%BF%85%E9%A1%BB%E6%B8%85%E9%99%A4%E6%88%96%E9%87%8D%E5%86%99%E8%BF%99%E4%BA%9B%E5%A4%B4%EF%BC%8C%E5%90%A6%E5%88%99%E6%B5%8F%E8%A7%88%E5%99%A8%E5%8F%AF%E8%83%BD%E5%8A%A0%E8%BD%BD%E6%97%A7%E7%BC%93%E5%AD%98%EF%BC%88%E5%90%AB%E6%9C%AA%E6%9B%BF%E6%8D%A2%E7%9A%84%20HTTP%20%E9%93%BE%E6%8E%A5%EF%BC%89%EF%BC%9A
- %0A%20%20
- %E6%B7%BB%E5%8A%A0%20
sub_filter_once%20off;%20%E5%85%81%E8%AE%B8%E5%A4%9A%E6%AC%A1%E6%9B%BF%E6%8D%A2%EF%BC%88%E9%BB%98%E8%AE%A4%E5%8F%AA%E6%9B%BF%E6%8D%A2%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8C%B9%E9%85%8D%EF%BC%89 %0A%20%20 - %E7%A6%81%E7%94%A8%20ETag%EF%BC%9A
etag%20off;%0A%20%20 - %E5%BC%BA%E5%88%B6%E5%88%B7%E6%96%B0%E7%BC%93%E5%AD%98%E5%A4%B4%EF%BC%88%E5%8F%AF%E9%80%89%EF%BC%89%EF%BC%9A
add_header%20Cache-Control%20" no-cache></script> - 完整示例片段:
location / {
proxy_pass https://backend;
proxy_set_header Host $host;
sub_filter 'src="http://' 'src="https://';
sub_filter 'href="http://' 'href="https://';
sub_filter_once off;
sub_filter_types text/html application/xhtml+xml;
etag off;
add_header Cache-Control "no-cache";
}











