Nginx 中有两个用于替换响应内容的模块:sub_filter
和 subs_filter
。
它们的主要区别:
-
sub_filter
: 基本字符串替换,不支持正则表达式,由 ngx_http_sub_filter_module 提供 -
subs_filter
: 支持正则表达式,可进行更复杂的匹配和替换,由 ngx_http_substitutions_filter_module 提供 -
subs_filter
需要ngx_http_sub_module
模块支持
sub_filter 模块
基本语法
sub_filter "old_string" "new_string";
配置示例
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
sub_filter_types *;
proxy_set_header Accept-Encoding '';
# 字符串替换
sub_filter 'Hello, World!' 'Hello, NGINX!';
sub_filter_once off; # 允许多次替换
}
}
subs_filter 模块
安装模块
# 克隆模块
git clone git://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
# 重新编译 Nginx
./configure --prefix=/usr/local/nginx \
--add-module=./ngx_http_substitutions_filter_module \
--with-http_ssl_module \
--with-http_stub_status_module
make && make install
基本语法
subs_filter pattern replacement [flags] [r=number];
`flags`参数说明
-
i
: 忽略大小写 -
g
: 全局匹配 -
o
: 仅替换第一次匹配 -
r
: 该模式被视为正则表达式,默认为固定字符串
配置示例
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
sub_filter_types *;
proxy_set_header Accept-Encoding '';
# 使用正则表达式替换
subs_filter 'http://old_domain.com' 'http://new_domain.com' ig;
subs_filter_types *;
# 使用捕获组的示例
subs_filter '(\d+)' '<span class="number">$1</span>' ig r;
}
}