秦悦明的运维笔记

nginx多重条件判断

nginx配置语法里面的if其实是不支持逻辑与,或操作的。但是可以通过set变量的方式绕过去。实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ($http_user_agent ~ "^Mozilla/5.0" ) {
set $test 1;
}
if ($request_uri ~ "sendSMS")
{
set $test "${test}2";
}
if ($request_uri !~ "vcode")
{
set $test "${test}3" ;
}
if ($test = 123)
{
return 403;
}

代码用于屏蔽所有Mozilla的agent发起的sendSMS uri的请求,并且uri中没有包含vcode信息的请求。直接会被返回403。这里要注意的是set操作进行的是不是算数操作,而是字符串拼接。
当然,如果是做合法性校验,应该也要在后端代码里面做。