Nginx sub_filter可动态替换HTML中硬编码路径,需启用sub_filter、设sub_filter_once off、指定sub_filter_types text/html,并禁用gzip;支持根路径重写和绝对URL映射,但不支持正则,变量替换需提前定义。

使用 Nginx 的 sub_filter 指令可以在反向代理响应返回客户端前,对 HTML 内容做实时文本替换,从而动态修正页面中硬编码的绝对路径链接(如 href="/css/app.css"、src="https://example.com/js/main.js"),避免修改源站代码或重新部署。
确保 sub_filter 基础配置生效
Nginx 默认不启用 sub_filter 的替换功能,需显式开启并注意响应体限制:
- 必须启用
sub_filter指令,并配对使用sub_filter_once off(允许多次替换)或on(仅替换首个匹配) -
sub_filter_types需明确包含text/html,否则对 HTML 不生效;可额外加入application/xhtml+xml或自定义 MIME 类型 - 响应体需未被压缩(gzip 已启用时,
sub_filter会失效),建议在 proxy location 中添加proxy_set_header Accept-Encoding "";禁用后端 gzip,或确保 Nginx 自身未对响应再压缩 - 替换内容不能跨 chunk(Nginx 流式处理),过长的 HTML 可能导致部分匹配失败;若遇漏替,可尝试增大
sub_filter_last_modified(非必需)或检查缓冲区(一般无需调整)
修正相对路径为当前上下文路径
当后端应用默认生成 /static/xxx 这类根路径,但代理到子路径(如 https://my.site/app/)时,需将其重写为相对当前路径:
- 例如将
href="/static/css/main.css"替换为href="/app/static/css/main.css" - 配置示例:
sub_filter '/static/' '/app/static/';<br>sub_filter_once off;<br>sub_filter_types text/html;
- 注意斜杠方向与结尾:确保源字符串精确匹配,避免误替(如
/static会命中/statics/);推荐加尾部斜杠限定范围
安全替换含协议的绝对 URL
对硬编码的完整 URL(如 src="https://api.example.com/v1/data"),可用 sub_filter 统一映射到代理路径或内部服务地址:
- 例如将外部 API 地址转为同域代理路径:
sub_filter 'https://api.example.com' '/api'; - 若目标域名含特殊字符(如点号、下划线),需注意正则无关——
sub_filter是纯字符串替换,不支持正则,所以.com就写.com,无需转义 - 替换后务必确认前端是否允许同域请求(CORS 已由代理消除),且后端
/api路由已正确 proxy_pass 到真实 API - 敏感信息(如 token、密钥)切勿出现在 HTML 中,
sub_filter不适合做逻辑判断或条件替换
配合变量实现灵活路径注入
利用 Nginx 内置变量(如 $host、$scheme)或自定义 map 变量,可让替换更适应多环境:
- 例如根据请求 host 动态注入 CDN 域名:
map $host $cdn_host {<br> default "cdn.example.com";<br> staging.example.com "cdn-staging.example.com";<br>}<br>...<br>sub_filter 'https://cdn.example.com' "https://$cdn_host"; - 注意:变量在
sub_filter中只支持简单展开,不支持嵌套或运行时计算;所有变量需在http块中提前定义 - 若需更复杂逻辑(如路径拼接、条件分支),应考虑改用
ngx_http_substitutions_filter_module(第三方增强模块)或前置构建阶段处理
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











