sub_filter可无侵入式替换html资源路径,需满足启用模块、匹配mime类型(如text/css)、开启输出缓冲三前提;推荐用带引号斜杠边界模式精准替换,避免误伤,并关闭gzip以防乱码。

直接用 sub_filter 替换 HTML 响应体里的资源路径,是最常用也最轻量的无侵入式修正方式。它不碰后端代码、不改构建配置,只要 Nginx 层配对了,页面一刷就生效。
确保基础前提全部满足
sub_filter 不是“写了就生效”,必须同时满足三项条件:
- Nginx 已启用
ngx_http_sub_module(主流发行版默认编译进去了,可执行nginx -V 2>&1 | grep -o with-http_sub_module确认) - 响应头含
Content-Type: text/html(或你显式声明支持的类型),否则模块直接跳过 - 输出缓冲已开启——即后端不能流式禁缓存返回;若用了
proxy_buffering off或X-Accel-Buffering: no,sub_filter 大概率失效
精准替换静态资源路径的写法要点
目标是把 href="/css/app.css" 或 src="/js/chunk.abc123.js" 这类路径,替换成带协议+域名的完整地址,或统一前缀(如 CDN)。关键在“锚点选得准”:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 推荐用带引号和斜杠边界的模式,例如:
sub_filter 'src="/' 'src="https://$host/';sub_filter 'href="/' 'href="https://cdn.example.com/'; - 避免只替换
/static/这类裸路径,容易误伤 HTML 内容中的其他斜杠(比如<div class="item-1">) <li>若资源路径含 hash(如 <code>app.a1b2c3.js),且你希望只对 JS/CSS 文件生效,可配合sub_filter_types限定范围,减少干扰 - 在
http、server或location块中加入:sub_filter_types text/css application/javascript; - 如果还要处理内联 JSON 或调试用的文本接口,可追加
application/json text/plain - 慎用
sub_filter_types *:虽省事,但可能对二进制响应(如图片)造成意外截断 -
gzip 干扰:后端若返回 gzip 压缩的 HTML,sub_filter 看到的是乱码。必须关闭压缩:
proxy_set_header Accept-Encoding "";gzip off;(或搭配gunzip on;解压后再过滤) -
HTML 换行导致匹配失败:比如
<script></script>中的src="/被折行,sub_filter 就匹配不到。对策是:
— 后端关闭 HTML 格式化/美化输出;
— 或改用更鲁棒的锚点,例如匹配"src="后紧跟/的组合,再用变量补全协议
必须显式扩展支持的 MIME 类型
默认 sub_filter 只处理 text/html。但现代前端页面中,JS 和 CSS 往往单独请求,它们的 Content-Type 是 application/javascript 或 text/css,不加声明就不会被过滤:
绕过压缩与跨行问题的实际对策
两个高频失效原因,有明确解法:










