Nginx 的 sub_filter 指令可动态替换 HTML 响应体中的绝对 URL,解决资源路径错位等问题;需启用 sub_filter_once off、处理 Content-Encoding、设置 sub_filter_types,并注意匹配精度与顺序。

可以通过 Nginx 的 sub_filter 指令在反向代理响应时,对 HTML 响应体中的绝对 URL 进行动态替换,从而解决资源路径错位、跨域加载失败或 CDN 切换等场景下的静态资源访问问题。关键在于正确启用替换、处理响应头限制、注意匹配精度和编码兼容性。
启用 sub_filter 并确保响应可修改
Nginx 默认不修改响应体,需显式开启并配合相关指令:
- 设置
sub_filter规则,如sub_filter "https://old.example.com/" "https://new.cdn.com/"; - 必须启用
sub_filter_once off;(默认为 on),否则只替换首个匹配项 - 确保后端返回的
Content-Encoding为identity(即未压缩);若后端返回gzip,需在 proxy 配置中加proxy_set_header Accept-Encoding "";或用gunzip on;解压后再处理 - 添加
sub_filter_types text/html text/css application/javascript;,显式声明支持处理的 MIME 类型(默认仅text/html)
处理常见绝对链接模式
HTML 中需修正的典型绝对资源路径包括:
-
→ 替换域名部分 -
<script src="/static/js/app.js"></script>→ 虽为相对路径,但若需补全为带 CDN 域名的绝对路径,可先用sub_filter "/static/" "https://cdn.example.com/static/"; -
url(/images/logo.png)(CSS 内)→ 需包含text/css在sub_filter_types中,并注意括号和引号的转义(实际匹配时不需转义,sub_filter是字面量匹配) - 避免过度替换:用更精确的模式,例如匹配
src="https://old.com/而非宽泛的https://old.com/,减少误伤文本内容
注意替换顺序与多次过滤
当需多处修正(如同时改 JS、CSS、图片域名),可链式使用多个 sub_filter:
- 按从长到短、从具体到宽泛的顺序书写规则,防止前序替换影响后续匹配(例如先替换
https://api.old.com/v2/,再替换https://api.old.com/) - 每个
sub_filter独立生效,Nginx 会按配置顺序依次执行,无需额外启用开关 - 若涉及大小写混杂的 URL(如部分小写、部分大写),
sub_filter区分大小写;如需忽略,需借助第三方模块(如ngx_http_substitutions_filter_module),原生不支持
验证与调试技巧
替换是否生效常因响应头或缓存干扰而难以察觉:
- 用
curl -H "Accept-Encoding: identity" -I http://your-proxy/检查响应头是否含Content-Encoding: identity和正确的Content-Type - 临时关闭浏览器缓存或使用
curl -s http://your-proxy/ | grep "cdn.example.com"直接查看原始响应体 - 在 location 块中加
add_header X-Subfilter-Status "active";辅助确认配置已加载 - 若页面含内联 JS 或 base 标签(如
),需单独处理该标签,否则会影响所有相对路径解析
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











