戏里戏外

Nginx 字符串匹配模块

2024-11-07#Nginx

Nginx 中有两个用于替换响应内容的模块:sub_filtersubs_filter

它们的主要区别:

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;
    }
}