专栏首页张戈的专栏Nginx 内容替换模块 http_substitutions_filter_module 及实用案例分享
原创

Nginx 内容替换模块 http_substitutions_filter_module 及实用案例分享

说到Nginx的内容替换功能,大部分人应该都听说过Nginx内置的的subs_filter替换模块,但是这个模块有个缺憾,就是只能替换一次,而且还不支持正则表达式,这就有些鸡肋了。

不过,我们可以集成一个第三方的替换模块:ngx_http_substitutions_filter_module,来实现我们的各种需求。

经过测试,这个模块至少有如下实用功能:

  • 支持多次替换
  • 支持正则替换
  • 支持中文替换

Ps:略有遗憾的是,这个替换不能使用到 if 判断模块内,否则就超神了。。。

下面,简单介绍下 ngx_http_substitutions_filter_module 的安装实用以及一些实用案例。

一、编译集成

和所有Nginx非内置模块一样,添加模块需要在编译的时候指定模块源码包来集成。当然,Tengine可以使用动态模块加载的功能,这里就不细说了。

①、下载模块源码包并解压,最后列出目录位置备用

[root@MyServer ~]# wget -O ngx_http_substitutions_filter_module-master.zip https://github.com/yaoweibin/ngx_http_substitutions_filter_module/archive/master.zip
[root@MyServer ~]# unzip ngx_http_substitutions_filter_module-master.zip
[root@MyServer ~]# cd ngx_http_substitutions_filter_module-master;pwd 
/root/ngx_http_substitutions_filter_module-master

github手动下载地址:https://github.com/yaoweibin/ngx_http_substitutions_filter_module/

②、在服务器上执行 nginx -V 查看当前 Nginx 编译参数,比如:

[root@MyServer ~]# /usr/local/nginx/sbin/nginx  -V
Tengine version: Tengine/2.1.2 (nginx/1.6.2)
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --add-module=../ngx_cache_purge-2.3 --with-http_sub_module

③、加上模块参数,重新编译Nginx

找到服务器上原来安装时留下的 Nginx 源码目录(如果没有请重新下载并解压,此处不赘述),进入目录后,在第②步中的参数基础上新增集成替换模块(请注意前面需要加上 ./configure ): ./configure [+原有参数+] --add-module=/root/ngx_http_substitutions_filter_module-master/ 例如:

./configure --prefix=/usr/local/nginx --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --add-module=../ngx_cache_purge-2.3 --with-http_sub_module --add-module=/root/ngx_http_substitutions_filter_module-master/

再往后,则是make以及平滑升级,请参考之前的文章完成:

Nginx在线服务状态下平滑升级或新增模块的详细操作记录

正确完成后,Nginx就具备内容替换功能了。

二、使用说明

模块的github主页其实已经有了很详细的说明了,这里就简单的做下搬运工。

使用示例:

location / {
    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;
}
从github给出的使用示例来看,这个模块涉及2个指令:
* subs_filter_types
subs_filter_types 语法: subs_filter_types mime-type [mime-types]
默认: subs_filter_types text/html
适用: http, server, location
subs_filter_types 是用来指定替换文件类型的 默认仅仅替换text/html类型的文件。

* subs_filter
subs_filter 语法: subs_filter source_str destination_str [gior]
默认: none
适用: http,server,location
subs_filter 是用来替换文本的,可以使用正则
g(默认):替换匹配项。
i  :区分大小写的匹配
o : 只匹配发现的第一个。
r  : 正则匹配。

三、案例分享

①、全站https

有了这个功能,要实现全站https也就是非常简单了,只要把本站的http://协议代码全部替换成https即可。当然,替换时要注意匹配范围,免得把不支持https的外链也一起替换了。。。 比如,将如下代码添加到网站Nginx配置内即可完成替换

location / { # 新增如下代码
    subs_filter http:// https:// gr; #将页面中的http链接全部替换为https

②、CDN域名替换

这个模块在CDN方面同样简单实用!比如,我们网站要用到七牛CDN,不管是纯代码还是插件,那都是靠PHP代码来进行替换的,性能肯定就不如Nginx直接替换来的简单粗暴了。

location / { # 新增如下代码,将静态文件域名替换成七牛
    subs_filter https://zhangge.net/([^"\']*?)\.(jpg|png|js|css|jpeg|bmp) https://example.qiniudn.com/$1.$2 igr;

Ps:经测试,在使用正则模式时,不能使用nginx内置变量,比如:$host,否则会出现如下报错: nginx: [emerg] match part cannot contain variable during regex mode in *

③、解决前台暴露管理员账号风险

前段时间,看到有博客在说 WordPress 会在前台暴露管理员登陆账户的问题,然后给出了较为复杂的解决办法:通过修改 WordPress 内核函数来隐藏账户名。

修改内核函数,一般是非常无奈,没有其他解决方法的时候才会用到,所以,我看到这个问题第一件时间想到的办法就是替换。

使用PHP替换是非常简单的,参考博客之前分享的文章即可搞定:

WordPress简单代码开启七牛CDN及集成七牛缩略图的方法

而对于本文来说,PHP替换方案依然过于复杂,因为本文一行规则即可解决问题,比如将登录名admin替换为null:

location / {
    # 替换管理员登录名 admin 为 null
    subs_filter  'author-admin' 'author-null';

其他登录名,请自行参考,若有多个登录名可以另起多行或使用正则表达式均可。 鉴于篇幅有限,就分享这三个实用技巧吧,其他就靠自己发掘了,比如镜像网站做内容替换什么的.......

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nginx内容替换模块http_substitutions_filter_module及实用案例分享

    说到 Nginx 的内容替换功能,大部分人应该都听说过 Nginx 内置的的 subs_filter 替换模块,但是这个模块有个缺憾,就是只能替换一次,而且还不...

    张戈
  • 如何在Ubuntu 16.04上使用Nginx的地图模块

    为网站配置服务器时,可能需要执行一些常见的条件操作。例如,某些文件可能会被用户的浏览器缓存比其他文件更长,或者网站的某些部分应该只允许通过安全连接(例如需要用户...

    小翼111
  • 如何在CentOS 7上使用Nginx的地图模块

    为网站配置服务器时,可能需要执行一些常见的条件操作。例如,某些文件可能会被用户的浏览器缓存比其他文件更长,或者网站的某些部分应该只允许通过安全连接(例如需要用户...

    黑色技术
  • 接入层Nginx架构及模块介绍分享

    1)帮助大家对Nginx有一定的认识 2)熟悉Nginx有哪些应用场景 3)熟悉Nginx特点和架构模型以及相关流程 4)熟悉Nginx定制化开发的几种模...

    Lucien168
  • 1-OpenResty 介绍 (摘抄)

    由于我的做小程序的时候改了下后台的安装软件,不是使用的单纯的Nginx,而是使用的OpenResty,然后呢在网上看到了有介绍OpenResty的,故摘抄下来,...

    杨奉武
  • Apache 与 Nginx 性能对比:Web 服务器优化技术

    多年前 Apache 基金会 Web 服务器 简称「Apache」,由于使用者众多几乎等同于「Web 服务器」。httpd(含义是简单的 http 进程)是它在...

    柳公子
  • SRT在B站的落地

    大家好,我是来自哔哩哔哩的郑龙,2012年至2017年我在广播电视行业从事工作,2017年我转型至互联网行业并加入了哔哩哔哩的视频云团队。在视频云团队的三年里,...

    LiveVideoStack
  • 为WordPress开启Nginx缩略图功能,七牛从此陌路

    张戈博客曾分享过不少关于云存储的一些经验技巧,对七牛感兴趣或者遇到相关问题的朋友可以看一看以前的相关文章: 七牛&又拍云 CDN 云存储节省 GET 次数的小...

    张戈
  • nginx入门到入门

    用户访问反向代理服务器。但是用户不知道访问的是反向代理服务器多个站点中的哪一个站点。对服务器服务。

    后端技术探索
  • 了解Nginx

    如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135...

    java架构师
  • 基于实践经验的比较:Nginx & Apache

    Apache和Nginx是世界上两个最流行的开源web服务器,他们一起支撑了互联网上超过50%流量。他们两个都支持多种负载模式并且可以和其他软件服务集成在一起提...

    后端技术探索
  • linux主要发行版安装nginx教程

    [nginx] name=nginx repo baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch...

    ianzhi
  • Nginx负载均衡实现tomcat集群方案简要小结

    所谓tomcat集群,就是可以向外提供并行服务的多台机器,任何一台服务器宕机,其它服务器可以替代它向外提供服务,而不影响用户访问。

    Java后端技术
  • 编写 Nginx 模块进行 RSA 加解密

    在《Nginx 模块系统:前篇》一文中,曾提过要展开聊聊如何编写和编译一个 Nginx 模块。

    soulteary
  • 大规模Nginx平台化实践,京东能提供哪些参考经验?

    Nginx是优秀的HTTP和反向代理服务器,京东各部门都在广泛使用,但普遍都面临着一些问题:

    后端技术探索
  • 一文梳理 Nginx 的称霸之路

    这几年 Nginx 已成为国内使用最广泛的 Web 服务器,无论创业公司还是一线大厂都在用,任何有性能需求的场合总能看到它的身影。

    Ms08067安全实验室
  • www2013338com请拨18608765024SRT在B站的落地

    大家好,我是来自哔哩哔哩的郑龙,2012年至2017年我在广播电视行业从事工作,2017年我转型至互联网行业并加入了哔哩哔哩的视频云团队。在视频云团队的三年里,...

    用户7106032
  • Kubernetes入门

    ​ 官方定义k8s能够对容器化软件进行部署管理,在不停机的前提下提供简单快速的发布和更新方式。换句话说,如果项目需要多机器节点的微服务架构,并且采...

    Cyylog
  • 巧用 Nginx 实现大规模分布式集群的高可用性

    本文是我对2019年GOPS深圳站演讲的文字整理。这里我希望带给各位读者的是,如何站在整个互联网背景下系统化地理解Nginx,因为这样才能解决好大流量分布式网络...

    陶辉

扫码关注云+社区

领取腾讯云代金券