sub_filter在Nginx反向代理中实现HTML绝对路径的精准字符串替换,需满足Content-Type匹配、禁用压缩、显式启用替换三项前提,支持静态路径修正、跨域URL映射及变量动态替换。

用 sub_filter 在负载均衡层(即 Nginx 反向代理)修正 HTML 中硬编码的绝对路径,核心是让 Nginx 在响应返回客户端前,对文本内容做精准字符串替换。它不改源站、不写代码,但配置稍有疏漏就可能失效或误替。
确保响应体可被识别和处理
sub_filter 不会自动生效,必须满足三个基础条件:
- 响应头
Content-Type必须是明确的文本类型,如text/html、text/css或application/javascript;默认只认text/html,其他需手动加进sub_filter_types - 响应不能被压缩——若后端返回
Content-Encoding: gzip,sub_filter 直接跳过。稳妥做法是在 location 块中加proxy_set_header Accept-Encoding "";,让后端不压缩 - 必须显式启用替换:仅写
sub_filter不够,还要配sub_filter_once off;,否则只替换第一个匹配项
修正根路径开头的静态资源引用
常见于 或 这类以 
/ 开头的路径。当代理路径不是根目录(比如 /blog/),这些链接会 404。
- 把
/css/替成/blog/css/:写sub_filter '/css/' '/blog/css/'; - 结尾斜杠很重要——加
/能避免误替/css-min/或/cssmap这类相似路径 - 多个路径需多条规则,顺序无关,但建议从长到短写(比如先换
/static/uploads/,再换/static/),防止重复替换
安全替换带协议的绝对 URL
例如页面里写死 src="https://cdn-old.example.com/js/main.js" 或 href="http://api.internal/v1",想统一映射到新 CDN 或代理路径。
- 直接字面替换即可:
sub_filter 'https://cdn-old.example.com' 'https://cdn.new.site'; - 点号、斜杠、冒号都不用转义,sub_filter 是纯字符串匹配,不是正则
- 若目标是转为同域相对路径,比如把
"https://api.internal/data"换成"/api/data",注意保留引号和前后空格,避免破坏 HTML 结构 - 别在未确认 CORS 策略时盲目替换为跨域地址;代理层已消除跨域,但前端仍可能校验 URL 协议或域名
配合变量提升灵活性(可选)
sub_filter 左侧(匹配部分)必须是静态字符串,但右侧(替换部分)支持 Nginx 变量,比如当前请求的协议、主机名:
-
sub_filter 'http://legacy.app' '$scheme://$host';—— 把旧域名动态映射到当前访问地址 - 变量只在运行时展开,无法用于“模糊匹配”,比如不能用
$1引用捕获组(除非启用 Nginx 1.9.4+ 的正则模式,用sub_filter /pattern/ replacement;) - 若需更复杂逻辑(如按路径分条件替换),sub_filter 不适合,应考虑用 Lua 或上游应用改造
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











