NGINX sub_filter和subs_filter 指令讲解

一、概述

在 NGINX 中,sub_filtersubs_filter 是两个用于替换响应内容中字符串的指令,它们主要用于反向代理和修改响应内容。下面是它们之间的主要区别:

  • sub_filter 是基本的字符串替换,不支持正则表达式。
  • subs_filter 支持更灵活的正则表达式替换,可以进行更复杂的匹配和替换操作。
  • subs_filterngx_http_sub_module 模块提供的功能,需要确保该模块被编译进 NGINX。

一般来说,如果只需要简单的字符串替换,使用 sub_filter 就足够了。如果需要更强大的正则表达式支持,可以使用 subs_filter

示例:

bash 复制代码
# 使用 sub_filter 进行字符串替换
location / {
    proxy_pass http://backend_server;
    sub_filter 'http://backend_server' 'http://frontend_server';
    sub_filter_once off;  # 可选,允许多次替换,默认为 off。
}

# 使用 subs_filter 进行正则表达式替换
location / {
    proxy_pass http://backend_server;
    subs_filter 'http://backend_server' 'http://frontend_server' ig;
}

二、nginx 环境部署

环境部署的详细过程,可以参考我这篇文章:NGINX - 高级负载均衡器、Web服务器、反向代理

官方地址:nginx.org

bash 复制代码
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xf nginx-1.24.0.tar.gz

# 编译部署
yum install -y gcc pcre-devel openssl-devel

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
make
make install

三、sub_filter

sub_filter 是 NGINX 提供的用于在响应内容中进行简单字符串替换的指令。它的基本语法如下:

bash 复制代码
sub_filter old_string new_string;

这里是一个详细示例,演示如何在 NGINX 中使用 sub_filter 进行字符串替换:

假设有一个后端服务器返回的 HTML 页面,其中包含了字符串 "Hello, World!",而我们希望将其替换为 "Hello, NGINX!"。

bash 复制代码
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;

        # 使用 sub_filter 进行字符串替换
        sub_filter 'Hello, World!' 'Hello, NGINX!';
        sub_filter_once off;  # 可选,允许多次替换,默认为 off。
    }
}

在这个配置中:

  • proxy_pass http://backend_server; 将请求转发给后端服务器。
  • sub_filter 'Hello, World!' 'Hello, NGINX!'; 指定了要查找和替换的字符串,将 "Hello, World!" 替换为 "Hello, NGINX!"
  • sub_filter_once off; 可选配置,表示允许多次替换。如果不设置这个选项,默认只替换第一次出现的字符串。

这样,当 NGINX 收到来自后端服务器的响应时,会在响应内容中查找并替换 "Hello, World!""Hello, NGINX!"。这种功能常用于在反向代理过程中修改响应内容,例如替换页面上的链接、域名或其他字符串。

请注意,sub_filter 只能进行简单的字符串匹配和替换,不支持正则表达式。如果需要更复杂的匹配和替换操作,可以考虑使用 subs_filter,该指令支持正则表达式。

四、subs_filter

subs_filterNGINXngx_http_sub_module 模块提供的指令,它可以在响应内容中使用正则表达式进行字符串替换。这使得它比 sub_filter 更灵活,能够处理更复杂的匹配和替换操作。

开始重新编译NGINX 支持 sub_filter 指令

bash 复制代码
git clone git://github.com/yaoweibin/ngx_http_substitutions_filter_module.git

# 开始重新编译
# ./configure --add-module=/path/to/module
./configure --prefix=/usr/local/nginx --add-module=./ngx_http_substitutions_filter_module --with-http_ssl_module --with-http_stub_status_module

# 安装
make && make install

# 重启nginx
pkill -9 nginx
nginx

# 检查
nginx -V

以下是一个详细的示例,演示如何在 NGINX 中使用 subs_filter

假设有一个后端服务器返回的 HTML 页面,其中包含了一组链接,而我们希望将这些链接的域名替换为新的域名。

bash 复制代码
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;

        # 使用 subs_filter 进行正则表达式替换
        subs_filter 'http://old_domain.com' 'http://new_domain.com' ig;
    }
}

在这个配置中:

  • proxy_pass http://backend_server; 将请求转发给后端服务器。
  • subs_filter 'http://old_domain.com' 'http://new_domain.com' ig; 指定了正则表达式,将匹配所有出现的 "http://old_domain.com",并替换为 "http://new_domain.com"。标志 ig 表示忽略大小写并进行全局替换。

使用正则表达式的好处是可以更灵活地匹配多个可能的变体,而不仅仅是一个精确的字符串。

请注意,subs_filter 的语法是:

bash 复制代码
subs_filter pattern replacement [flags] [r=number];
  • regex: 要替换的正则表达式。

  • replacement_string: 替换后的字符串。

  • flags: 可选,正则表达式的标志。

    • i(大小写不敏感):如果设置了 i 标志,将会忽略大小写,即不区分大小写。示例:subs_filter 'pattern' 'replacement' i;
    • g(全局匹配):如果设置了 g 标志,将会进行全局匹配,即替换所有匹配的字符串,而不仅仅是第一个。示例:subs_filter 'pattern' 'replacement' g;
    • o(替换一次):如果设置了 o 标志,将只替换第一次匹配到的字符串,不进行全局替换。示例:subs_filter 'pattern' 'replacement' o;
    • n(不进行替换):如果设置了 n 标志,将不进行实际的替换操作,仅计数匹配的字符串。示例:subs_filter 'pattern' 'replacement' n;
    • q(不输出警告):如果设置了 q 标志,将不输出关于替换操作的警告信息。示例:subs_filter 'pattern' 'replacement' q;
    • c(大小写敏感):如果设置了 c 标志,将进行大小写敏感的匹配。示例:subs_filter 'pattern' 'replacement' c;
    • p(省略前导空格):如果设置了 p 标志,将省略替换后字符串中的前导空格。示例:subs_filter 'pattern' 'replacement' p;
    • e(不进行内存溢出检查):如果设置了 e 标志,将不进行内存溢出检查。示例:subs_filter 'pattern' 'replacement' e;
  • r=number:可选项,用于指定替换字符串的格式。用于正则匹配。

下面是一个示例,演示如何使用 r 参数进行替换字符串的格式控制:

bash 复制代码
location / {
    proxy_pass http://backend_server;

    # 使用 subs_filter 进行正则表达式替换,并指定 r 参数
    subs_filter '(\d+)' '<span class="number">$1</span>' ig r;
}
  • 在这个示例中,正则表达式 (\d+) 匹配数字,并使用替换字符串 <span class="number">$1</span> 进行替换。
  • $1 表示匹配到的数字,而 <span class="number"></span> 将数字包裹在 HTML<span> 元素中,以实现格式化效果。

通过使用 r 参数,可以在替换字符串中使用正则表达式匹配到的内容,从而实现更灵活的替换操作。

通过使用 subs_filter,可以在 NGINX 中执行更复杂的字符串替换操作,以满足特定的需求。

NGINX sub_filter和subs_filter 指令的讲解就先到这里了,有任何疑问也可关注我公众号:大数据与云原生技术分享,进行技术交流,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~

相关推荐
曲幽18 分钟前
FastAPI实战:WebSocket vs Socket.IO,这回真给我整明白了!
python·websocket·nginx·socket·fastapi·web·async·socketio
袁庭新3 小时前
M系列芯片Mac上通过Homebrew一键安装/卸载Nginx并上线项目全指南
运维·nginx·macos·袁庭新·袁庭新ai
Densen20144 小时前
发布blazor应用到Linux, 使用nginx作为WebSocket代理
linux·websocket·nginx
不是书本的小明4 小时前
Apache vs Nginx vs Tomcat 核心区别与优化
nginx·tomcat·apache
困惑阿三1 天前
客户消息及时反馈
nginx·node.js·飞书·企业微信
liurunlin8881 天前
httpslocalhostindex 配置的nginx,一刷新就报404了
运维·nginx
BullSmall1 天前
Nginx负载均衡会话保持配置指南
运维·nginx·负载均衡
你才是臭弟弟1 天前
Nginx部署前后端
运维·nginx
_下雨天.2 天前
Nginx性能调优与深度监控
运维·nginx