Nginx if与set指令
2016-01-11 by dongnan
开始之前
由于 nginx if
指令不支持逻辑与操作,所以需要"曲线救国",依次赋值变量,最后判断变量值,完成逻辑与功能。
目标
- 使用 nginx
$http_user_agent、$uri
变量,结合 if 语句,完成多重条件判断。 - 应用场景,对恶意 post行为返回
405
状态。
配置文件
# 执行命令
cat /etc/nginx/conf.d/default.conf
# 返回结果
server
{
#... 其它配置项省略
# 设置变量为空字符串
set $black '';
# 条件1
if ($http_user_agent ~* "(compatible; MSIE 9.0; Windows NT 6.1)") {
set $black "${black}1";
}
# 条件2
if ($uri ~* "/tools/sendSms" ) {
set $black "${black}1";
}
# 条件3 "逻辑与"为变量叠加的形式,既条件为真设置值为1.
if ($request_method = POST) {
set $black "${black}1";
}
# 条件3 "逻辑或",如任意一个条件为假设置值为0.
if ($request_method != POST) {
set $black "${black}0";
}
# 叠加后的变量值,"逻辑与"111,"逻辑或"110.
if ($black = "111") {
return 405;
}
}
验证
使用 POST
方法,服务器返回 405
状态。
curl -LI -X "POST" -A "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "http://localhost/tools/sendSms?type=mobilephone&mobilephone=1597XXXXX06"
HTTP/1.1 405 Not Allowed
Server: nginx
#...省略
其它方法(GET/HEAD
),服务器返回 200
状态。
curl -LI -A "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "http://localhost/tools/sendSms?type=mobilephone&mobilephone=1597XXXXX06"
HTTP/1.1 200 OK
Server: nginx
#...省略
指令帮助
return
语法: return code
默认值: none
使用字段: server, location, if
这个指令结束执行配置语句并为客户端返回状态代码,可以使用下列的值:
204,400,402-406,408,410, 411, 413, 416与500-504。
此外,非标准代码444将关闭连接并且不发送任何的头部。
set
语法: set variable value
默认值: none
使用字段: server, location, if
指令设置一个变量并为其赋值,其值可以是文本,变量和它们的组合。
你可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值