【www.bbyears.com--nginx】
nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition。
我们可以用变量的方式来间接实现。
要实现的语句:
代码如下if ($arg_unitid = 42012 && $uri ~/thumb/){
echo "www.111cn.net";
}
如果按照这样来配置,就会报nginx: [emerg] invalid condition错误。
可以这么来实现,如下所示:
代码如下set $flag 0;
if ($uri ~ ^/thumb/[0-9]+_160.jpg$){
set $flag "${flag}1";
}
if ($arg_unitid = 42012){
set $flag "${flag}1";
}
if ($flag = "011"){
echo "www.111cn.net";
}
例,nginx实现多重if判断
# 要实现的语句
if ($remote_addr ~ "^(12.34|56.78)" && $http_user_agent ~* "spider") {
return 403;
}
# 这是等效的,并真实可用的配置
set $flag 0;
if ($remote_addr ~ "^(12.34|56.78)") {
set $flag "${flag}1";
}
if ($http_user_agent ~* "spider") {
set $flag "${flag}2";
}
if ($flag = "012") {
return 403;
}
举例
代码如下if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
//如果UA包含”MSIE”,rewrite 请求到/msie目录下
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
set $id $1;
}
//如果cookie匹配正则,设置变量$id等于正则引用部分
if ($request_method = POST ) {
return 405;
}
//如果提交方法为POST,则返回状态405 (Method not allowed)
if (!-f $request_filename) {
break;
proxy_pass http://127.0.0.1;
}
//如果请求文件名不存在,则反向代理localhost
if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
}
//如果query string中包含”post=140″,永久重定向到example.com