Nginx内容替换模块:http_substitutions_filter_module

VPS

Nginx内容替换模块:http_substitutions_filter_module

说到 Nginx 的内容替换功能,第三方的替换模块ngx_http_substitutions_filter_module非常强大,可以实现我们的各种需求。

一、编译集成

①、下载模块源码包并解压:

[root@vultr ~]# cd /usr/local/src
[root@vultr src]# wget -O ngx_http_substitutions_filter_module-master.zip //github.com/yaoweibin/ngx_http_substitutions_filter_module/archive/master.zip
[root@vultr src]# unzip ngx_http_substitutions_filter_module-master.zip
[root@vultr src]# cd ngx_http_substitutions_filter_module-master && pwd

②、编译参数

#查看目前 Nginx 的版本
nginx -V
#默认的 Nginx 源码目录在/usr/local/src 下
[root@vultr src]# cd nginx-1.13.3
#重新编译 nginx,新增 ngx_http_substitutions_filter_module 模块
./configure(Nginx-V 已有的模块)--add-module=../ngx_http_substitutions_filter_module-master/
#编辑成功后 make,注意不要 make install
#重命名 nginx 旧版本二进制文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
#拷贝一份新编译的二进制文件
cp objs/nginx /usr/local/nginx/sbin/
#升级
make upgrade
#确认
nginx -V
#重新加载 Nginx
nginx -s reload

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

二、使用说明

使用示例:

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 //$host;
}

这个模块涉及两个指令:

* 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:// // gr; #将页面中的 http 链接全部替换为 https

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

location / { # 新增如下代码,将静态文件域名替换成 CDN 加速域名 static
    subs_filter //www.youfencun.com/([^"\']*?)\.(jpg|png|js|css|jpeg|bmp) //static.youfencun.com/$1.$2 igr;

Ps:非常遗憾的是,这个模块无法使用 if 判断语句,这样无法用于:

if (!is_admin()) {}

用于禁止后台使用 CDN 加速了。不过也非常简单,比如使用又拍云的 CDN 的话,可以将 wp-admin 目录下的所有 css 及 js 文件上传至 CDN 服务器即可,这样也同时完成了后台静态文件的加速。
③、解决前台暴露管理员账号风险
PHP 替换方案过于复杂,而这里一行规则即可解决问题,比如将登录名 admin 替换为 null:

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

篇幅有限,仅举例二三。

© 声明:本站原创文章采用BY-NC-SA创作共用协议,转载时请标明本文地址;非原创(转载)文章版权归原作者所有。

RECENT POSTS

Stay Hungry. Stay Foolish.

数据库查询次数:11次,页面生成时间:0.031秒。