在 nginx 源码编译中添加 sub 模块,需要下载与当前 nginx 版本一致的源码包,解压后进入目录,使用 ./configure 命令并添加 --add-module=/path/to/ngx_http_substitutions_filter_module 参数指向该第三方模块的源码路径,最后执行 make 和 make install。此操作会替换原有的二进制文件,务必先备份旧版 nginx 可执行文件。

如何配置 sub 模块以替换 HTML 中的特定字符串
配置 sub_filter 指令需要在 http、server 或 location 块中指定源字符串和目标字符串。默认情况下,该模块只匹配一次,若需全局替换,必须配合 sub_filter_once off 使用。此外,该模块仅对文本内容生效,且通常要求响应头中包含 text/html 类型。

server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
# 开启全局替换
sub_filter_once off;
# 替换源字符串为目标字符串
sub_filter 'old-string' 'new-string';
# 可选:不区分大小写
sub_filter_types text/html application/json;
}
}
sub 模块在处理 gzip 压缩响应时的行为限制
当后端返回的数据启用了 gzip 压缩时,Nginx 默认的 sub 模块无法直接修改压缩流中的字节,因为它是基于明文文本进行正则匹配的。要使 sub 模块在 gzip 场景下生效,必须在配置中启用 gzip_vary on 并确保 Nginx 在发送响应前解压缩内容,或者依赖较新版本的 Nginx 结合 proxy_cache 或特定的补丁支持。在标准开源版本中,通常建议在 location 中禁用 gzip 或使用 gzip_static 配合缓存策略来间接实现,但最直接的方式是确认 sub_filter 是否被配置为处理已压缩的内容(部分定制内核或高级配置可能支持,但标准行为是不支持的)。

# 注意:标准 sub_filter 不支持直接修改 gzip 响应
# 以下配置尝试强制解压缩或确保内容可被替换
location / {
proxy_pass http://backend;
proxy_set_header Accept-Encoding '';
sub_filter_once off;
sub_filter 'old' 'new';
}











