nginx多條件if判斷後rewrite,減輕後端php工作壓力(隨筆)

先說下我對nginx配置文件的認識:

      nginx的配置文件可以看成是一個程序,一個按照程序員思維習慣進行語法設置的nginx配置程序,編寫簡單便於理解,而且配合着各種變量和if判斷等指令可以靈活的做各種策略設置。

      工作中,每當一個請求過來,都會執行一遍配置文件,配置文件的各個變量也會伴隨着重新開闢一套,也就是說每個請求是相互獨立的存在空間,而配置文件裏的指令集的多少會根據編譯模塊的不同而不同,有些時候你配置一個指令,用nginx -t測試沒通過,不一定是指令或語法寫錯,而是對應的模塊沒有編譯進去,可以用nginx -m查看一下對應的模塊。

 

遇到的具體問題和解決思路:

      這兩天在做一個七層策略,優化訪問請求,原來有大量安卓過來的302、301是通過後端php代碼實現的,爲了減輕後端php的工作負載,同時減少日誌的輸出量,想盡量把處理放到nginx這一層上。具體想法是當匹配到某個url、且ua是手機安卓時,進行一次rewrite操作,就用最基本的nginx配置文件實現,也不去用lua腳本之類的。

      假設要匹配的url 是http://abc.def.com/aaa.html  ,匹配後302rewrite到http://www.hig.com我判斷的邏輯是host=abc.def.com 並且是 request_uri=aaa.html 並且在ua中匹配到是安卓的手機設備。經過了解,安卓手機設備對應的ua的特點是同時含有android和mobile關鍵字,其實最後就是4層判斷,這四層判斷同時成立就rewrite,這四個判斷條件是:

 

$host = "abc.def.com"
$request_uri = "aaa.html"
$http_user_agent ~* "mobile"
$http_user_agent ~* "android"

 

      經過查詢瞭解,nginx配置文件是不支持if嵌套、並且不支持類似shell 的 &&  和 || 的寫法 ,這樣就必須想別的辦法解決,是的,可以變量做flag標記的方式來解決,網上也有很多例子,最後我的寫法如下:

 

set $flag 0;
if ( $host = "abc.def.com" ){
   set $flag "1";
   }
if ( $request_uri = "/aaa.html" ){
   set $flag "${flag}1";
   }
if ( $http_user_agent ~* "mobile" ){
   set $flag "${flag}1";
   }
if ( $http_user_agent ~* "android" ){
   set $flag "${flag}1";
   }
if ( $flag = "1111" ){
   rewrite ^/(.*)$ http://www.hig.com redirect;
   }

 

其中注意:if指令後面要有空格,最後有幾個1表示有幾個判斷。

自建個人原創站運維網咖社(www.net-add.com),新的博文會在網咖社更新,歡迎瀏覽


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章