我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本篇文章继续讲述nginx的反代功能,广大读者已经知道了,nginx可以使用sub_filter指令,替换返回内容中的文本。但是,这样做有个限制就是:仅仅可以设置一组替换值。那么,当如果有两组甚至N组数据需要替换呢?当然,如果使用php之类的后端语言处理的话,这事儿根本就不能算得上是事儿。但是,这里是单纯的使用nginx来处理这种事情。

苏南大叔:nginx 如何添加 substitutions_filter 模块,subs_filter 指令多次替换 - nginx-subs
nginx 如何添加 substitutions_filter 模块,subs_filter 指令多次替换(图4-1)

那么这个需求的答案就是:substitutions_filter模块,这个模块并不是nginx官方自带的,是属于第三方模块。所以,这里需要重新编译nginx

本文中的测试环境是:centos7.5宝塔 5.9.0nginx 1.14substitutions_filter 0.64

寻找nginx源码位置

本文的写作环境是基于centos7.5下面的宝塔5.9.0的。那么nginx的代码,也是由宝塔提供的。那么通过查找得知:宝塔的nginx的源码位置为:/www/server/nginx/src/。记下这个路径。如果说为啥断定这个目录是nginx的源码目录,大家可以看看,这个目录下面,是不是有个makefile文件,这是很明显的标志的。

苏南大叔:nginx 如何添加 substitutions_filter 模块,subs_filter 指令多次替换 - nginx_src
nginx 如何添加 substitutions_filter 模块,subs_filter 指令多次替换(图4-2)

查看nginx的编译参数

因为大家都知道nginx的编译选项不同,最终得到的可执行文件,也是有较大区别的。所以,这里,查看nginx的编译选项,还是非常有必要的。查看的方式很简单。代码如下:

nginx -V

注意这里的是-V,不是-v。是大写字母V,否则得不到详细的编译参数信息。

返回值类似如下:

nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2l  25 May 2017
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.40 --with-ld-opt=-ljemalloc

上述内容中的configure arguments后面的值,就是苏南大叔的目标字符串。记下这些选项,备用。

下载subs模块代码

substitutions_filter_module 项目地址是:

截至到发稿,这个最新版本是0.6.4。貌似作者好几年没有更新代码了。

苏南大叔:nginx 如何添加 substitutions_filter 模块,subs_filter 指令多次替换 - subs_release
nginx 如何添加 substitutions_filter 模块,subs_filter 指令多次替换(图4-3)

cd <nginx_src_folder>
git clone git://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
./configure <原有的configure arguments>  --add-module=<nginx_src_folder>/ngx_http_substitutions_filter_module
make&&make install

注意替换<原有的configure arguments>为真实得到的原有配置项目。替换<nginx_src_folder>为你的真实源码目录,在本文中,此值为:/www/server/nginx/src/

如果是第二次安装,可能需要的清理命令是:

cd /www/server/nginx/src/
make clean
rm -rf ngx_http_substitutions_filter_module/

比如对于苏南大叔来说,命令行应该是这样的:

cd /www/server/nginx/src/
git clone git://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
./configure --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-pcre=pcre-8.40 --with-ld-opt=-ljemalloc --add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module
make&&make install

configure的时候,一定要注意查看输出的日志,可能因为会有些参数不合适,需要被删除掉。如果是严格按照nginx -V取得的编译参数,一般来说,不会有问题的。

编译的过程比较漫长,经过极其漫长的等待后,苏南大叔在/www/server/nginx/src/objs/下面,发现了新生成的nginx文件。

苏南大叔:nginx 如何添加 substitutions_filter 模块,subs_filter 指令多次替换 - nginx_src2
nginx 如何添加 substitutions_filter 模块,subs_filter 指令多次替换(图4-4)

nginx 如何生效

正常来说,install之后就可以生效了。

make install

生效后的nginx位置是:/www/server/nginx/sbin/nginx

没生效的话,补救措施

但是,如果没有生效,我们还可以手工操作一下。

第一步:通过which命令,可以获得当前nginx的位置。注意得到的路径值可能有出入。

which nginx

返回值:

/usr/bin/nginx

第二步:手工替换nginx:

systemctl stop nginx
rm -rf /usr/bin/nginx_old
mv /usr/bin/nginx /usr/bin/nginx_old
cp /www/server/nginx/src/objs/nginx /usr/bin/
systemctl start nginx

使用范例

新的指令为subs_filter,完全对标的是:sub_filter。那么,就可以在nginx的配置中,多次设置subs_filter即可。在配置中,还可以使用正则表达式和变量。

subs_filter_types text/html text/css text/xml;
subs_filter st(\d*).example.com $1.example.com ir;
subs_filter a.example.com s.example.com;
subs_filter http://$host https://$host;

在这里,苏南大叔推荐您再回头看看nginx设置代理的方法。

结论

nginx 添加了 substitutions_filter 模块之后,就可以愉快地使用 subs_filter 指令多次替换文本了。但是,这个就是最终的答案了么?不,因为,你会发现对于某些被代理的网站,你的文本替换,会失败的。那么,这究竟是为什么呢?

请查看苏南大叔的后续文章,了解sub_filtersubs_filter 替换失败的处理方案。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   nginx    proxy