說到Nginx的內(nèi)容替換功能,大部分人應該都聽說過Nginx內(nèi)置的的subs_filter替換模塊,但是這個模塊有個缺憾,就是只能替換一次,而且還不支持正則表達式,這就有些雞肋了。
不過,我們可以集成一個第三方的替換模塊:ngx_http_substitutions_filter_module,來實現(xiàn)我們的各種需求。
經(jīng)過測試,這個模塊至少有如下實用功能:
①、支持多次替換
②、支持正則替換
③、支持中文替換
Ps:略有遺憾的是,這個替換不能使用到 if 判斷模塊內(nèi),否則就超神了。。。
下面,簡單介紹下 ngx_http_substitutions_filter_module 的安裝實用以及一些實用案例。
一、編譯集成
和所有Nginx非內(nèi)置模塊一樣,添加模塊需要在編譯的時候指定模塊源碼包來集成。當然,Tengine可以使用動態(tài)模塊加載的功能,這里就不細說了。
①、下載模塊源碼包并解壓,最后列出目錄位置備用
| [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/
②、在服務(wù)器上執(zhí)行 nginx -V 查看當前 Nginx 編譯參數(shù),比如:
| [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 |
③、加上模塊參數(shù),重新編譯Nginx
找到服務(wù)器上原來安裝時留下的 Nginx 源碼目錄(如果沒有請重新下載并解壓,此處不贅述),進入目錄后,在第②步中的參數(shù)基礎(chǔ)上新增集成替換模塊(請注意前面需要加上 ./configure ):
./configure [+原有參數(shù)+] --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在線服務(wù)狀態(tài)下平滑升級或新增模塊的詳細操作記錄
正確完成后,Nginx就具備內(nèi)容替換功能了。
二、使用說明
模塊的github主頁其實已經(jīng)有了很詳細的說明了,這里就簡單的做下搬運工。
使用示例:
| 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 :區(qū)分大小寫的匹配
o : 只匹配發(fā)現(xiàn)的第一個。
r : 正則匹配。
三、案例分享
①、全站https
有了這個功能,要實現(xiàn)全站https也就是非常簡單了,只要把本站的http://協(xié)議代碼全部替換成https即可。當然,替換時要注意匹配范圍,免得把不支持https的外鏈也一起替換了。。。
比如,將如下代碼添加到網(wǎng)站Nginx配置內(nèi)即可完成替換
| location / { # 新增如下代碼 subs_filter http:// https:// gr; #將頁面中的http鏈接全部替換為https |
②、CDN域名替換
這個模塊在CDN方面同樣簡單實用!比如,我們網(wǎng)站要用到七牛CDN,不管是純代碼還是插件,那都是靠PHP代碼來進行替換的,性能肯定就不如Nginx直接替換來的簡單粗暴了。
| location / { # 新增如下代碼,將靜態(tài)文件域名替換成七牛 subs_filter https://zhangge.net/([^"\']*?)\.(jpg|png|js|css|jpeg|bmp) https://example.qiniudn.com/$1.$2 igr; |
Ps:經(jīng)測試,在使用正則模式時,不能使用nginx內(nèi)置變量,比如:$host,否則會出現(xiàn)如下報錯:
nginx: [emerg] match part cannot contain variable during regex mode in ***
③、解決前臺暴露管理員賬號風險
前段時間,看到有博客在說 WordPress 會在前臺暴露管理員登陸賬戶的問題,然后給出了較為復雜的解決辦法:通過修改 WordPress 內(nèi)核函數(shù)來隱藏賬戶名。
修改內(nèi)核函數(shù),一般是非常無奈,沒有其他解決方法的時候才會用到,所以,我看到這個問題第一件時間想到的辦法就是替換。
使用PHP替換是非常簡單的,參考博客之前分享的文章即可搞定:
WordPress簡單代碼開啟七牛CDN及集成七??s略圖的方法
而對于本文來說,PHP替換方案依然過于復雜,因為本文一行規(guī)則即可解決問題,比如將登錄名admin替換為null:
| location / { # 替換管理員登錄名 admin 為 null subs_filter 'author-admin' 'author-null'; |
其他登錄名,請自行參考,若有多個登錄名可以另起多行或使用正則表達式均可。
鑒于篇幅有限,就分享這三個實用技巧吧,其他就靠自己發(fā)掘了,比如鏡像網(wǎng)站做內(nèi)容替換什么的....