nginx subs_filter正则
解决方案
Nginx的subsfilter模块可以用于在响应内容中替换指定字符串,支持正则表达式匹配。它常用于修改后端返回的内容,例如更改HTML中的特定链接、文本等。介绍如何使用subsfilter结合正则表达式来实现精准的内容替换。
一、配置基础环境
确保Nginx已安装并启用了subs_filter模块。可以通过以下命令检查:
bash
nginx -V 2>&1 | grep -- '--with-http_sub_module'
如果未启用该模块,在编译Nginx时需要添加--with-http_sub_module
参数重新编译。
二、基本用法示例
假设我们要将页面中所有的“旧域名”替换为“新域名”。
1. 简单字符串替换
nginx
location / {
subs_filter 'old-domain.com' 'new-domain.com';
subs_filter_types text/html;
}
2. 使用正则表达式替换(非贪婪匹配)
当遇到更复杂的情况时,如只替换特定位置或格式的内容:
nginx
location / {
# 替换所有形如 http(s)://old-domain.com/.* 的URL
subs_filter '(https?://)old-domain.com(/.*)?' '$1new-domain.com$2' ir;
subs_filter_types text/html;
}
- i
:忽略大小写
- r
:表示模式是正则表达式
- g
:全局替换(可选)
三、高级应用技巧
1. 多个规则组合
当需要同时处理多个替换需求时:
```nginx
location / {
# 定义多个过滤规则
set $rules '';
if ($request_uri ~* ".(html|htm)$") {
set $rules '1';
}
# 根据条件应用不同规则
if ($rules = '1') {
subs_filter 'old-text' 'new-text' ir;
subs_filter 'example-old' 'example-new' ir;
}
subs_filter_types text/html;
}
```
2. 避免无限循环
在某些情况下可能会出现递归替换导致死循环的问题。可以通过限制替换次数来避免:
nginx
location / {
# 最多执行5次替换
subs_filter 'pattern' 'replacement' irg;
subs_filter_once off;
subs_filter_max_attempts 5;
subs_filter_types text/html;
}
以上就是关于Nginx subs_filter模块配合正则表达式的常见用法和注意事项。根据实际应用场景选择合适的配置方式,能够灵活地对响应内容进行定制化修改。