先說下我對nginx配置文件的認識:php
nginx的配置文件能夠當作是一個程序,一個按照程序員思惟習慣進行語法設置的nginx配置程序,編寫簡單便於理解,並且配合着各類變量和if判斷等指令能夠靈活的作各類策略設置。html
工做中,每當一個請求過來,都會執行一遍配置文件,配置文件的各個變量也會伴隨着從新開闢一套,也就是說每一個請求是相互獨立的存在空間,而配置文件裏的指令集的多少會根據編譯模塊的不一樣而不一樣,有些時候你配置一個指令,用nginx -t測試沒經過,不必定是指令或語法寫錯,而是對應的模塊沒有編譯進去,能夠用nginx -m查看一下對應的模塊。android
遇到的具體問題和解決思路:nginx
這兩天在作一個七層策略,優化訪問請求,原來有大量安卓過來的30二、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,這四個判斷條件是:shell
$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表示有幾個判斷。bash
自建我的原創站運維網咖社(www.net-add.com),新的博文會在網咖社更新,歡迎瀏覽。運維