ngx_http_substitutions_filter_module如何幫助你進(jìn)行內(nèi)容替換
最近琢磨著將靜態(tài)資源鏈接的默認(rèn)驛站域名替換成白嫖的國內(nèi)備案域名方才接觸到這個Module。具體參見:https://post.cplus8.com/d/608
對于替換網(wǎng)頁內(nèi)容,nginx官方自帶的ngx_http_sub已經(jīng)能夠做到了,但對于我這種情況是無能為力的。如果我無腦將靜態(tài)資源路徑post.cplus8.com/assets替換成srcplus.ddwoo.top的話就會把css的也換掉,出現(xiàn)RocketLoader兼容性問題;如果逐條替換那真是閑的蛋疼……
This in image
模塊介紹
ngx_http_sub_module也僅是支持了最基本的字符串替換以及限定MINE類型sub_filter_tpyes(如text/html)和是否多次替換(sub_filter_once)的簡單特性。而相比之下,有
由國人開發(fā)的ngx_http_substitutions_filter_module則顯得極為強(qiáng)大,輕而易舉的幫助我們解決上述問題。
項(xiàng)目地址:https://github.com/yaoweibin/ngx_http_substitutions_filter_module
This in image
先來看一下它的特性
同ngx_http_subs_filter一樣具有的mine類型限制和多次替換有無
支持正則表達(dá)式的匹配,大小寫字母的區(qū)分與匹配
支持指定變量繞過替換
一個使用示例
下文將簡單介紹如何安裝和使用
Details of installation and usage are as follows.
安裝/Installation
由于是第三方非內(nèi)置的模塊,這里需要你重新編譯您的nginx。
如果您在用寶塔面板,您可以下滑
下載ngx_http_substitutions_filter_module源碼
cd /path/to/ngx_http_substitutions_filter_module
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
2.使用nginx -V查看現(xiàn)在的編譯參數(shù)
root@cpluserver:~# nginx -V
nginx version: nginx/1.23.2
built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
built with OpenSSL 1.1.1q? 5 Jul 2022
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_cache_purge --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_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-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module
將configure arguments后面一串編譯參數(shù)復(fù)制出來備用
3.下載nginx源碼進(jìn)行編譯,替換原來的nginx
Especially
如果您使用的是寶塔面板的話,在最近的安裝的腳本當(dāng)中,他們已經(jīng)默認(rèn)加入了ngx_http_substitutions_filter_module模塊,(這一點(diǎn)我還是吹吹寶塔)您可以通過nginx -V來確認(rèn)是否存在;若無,您只需要將原有版本卸載再安裝一遍即可以;如果還是不行,您可以在安裝時選擇編譯安裝并且添加好這模塊的參數(shù)--add-module:/path/to/ngx_http_substitutions_filter_module完成安裝。
別問為什么我在安裝時看到有報(bào)錯提示:ngx_http_substitutions_filter_module have multiple definitions時困惑了很久。
至此,您的nginx已經(jīng)具備高級的內(nèi)容替換了!
說明和使用范例/Usage & Examples
以下是說明:
你可以看到,這玩意指令叫subs_filter真就對標(biāo)ngx_http_sub_module的sub_filter。
這里簡單說明下:
subs_filter_type [MINE] ,需要設(shè)置proxy_set_header Accept-Encoding "";禁用gzip壓縮與前者一樣,這里不必贅述。
subs_filter允許將nginx響應(yīng)中的源字符串(正則表達(dá)式或固定的)和目標(biāo)字符串。變量
只有在固定字符串模式下,匹配文本中的變量才是可用的,這意味著 匹配的文本不能包含變量,如果它是一個正則表達(dá)式。替換文本可以包含變量。支持每個位置有一個以上的變量。支持每個位置有多個替換規(guī)則。
subs_filter [source_str] [destination_str] 參數(shù)(igor)
參數(shù)說明
g(默認(rèn)):替換匹配項(xiàng)。
i :區(qū)分大小寫的匹配
o : 只匹配發(fā)現(xiàn)的第一個。
r : 啟用正則匹配。
subs_filter_bypass 變量1 變量2 …
示例
對于驛站的需求,相比您已經(jīng)很快就能想出來的。
我們可以使用正則對特定的文件后綴進(jìn)行匹配
,從而完成替換,像這樣
subs_filter https://post.cplus8.com/assets/([^"\']*?)\.(jpg|png|webp|js|jpeg|bmp|woff2|woff) https://srcplus.ddwoo.top/$1.$2 igr;
變量一包含了任意字符,變量2包含了特定的文件后綴,這樣便可以替換css之外一些常用的靜態(tài)資源到國內(nèi)cdn。然而這也并非什么優(yōu)雅的方法,最好還是去寫個flarum插件修改,這只是個下下策。
其他實(shí)例
全站http資源替換成https
subs_filter http://$host https://$host;