先说下我对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),新的博文会在网咖社更新,欢迎浏览。运维