Ngixn运维之七 if、set、return
- set
- return
- if
- 正则表达式匹配:
- 文件及目录匹配判断:
- AND,OR多重判断
set
Syntax: set $variable value;
Default: —
Context: server, location, if
set可以为变量设置值,值可以为字符串/变量以及它们的组合。
例如:
set $s1 1;
set $s2 "${s1}1"
return
Syntax: return code [text]; return code URL; return URL;
Default: —
Context: server, location, if
停止处理并且返回响应码给客户端,非标准代码444会在不发送响应头的情况下关闭连接。
从 0.8.42版本开始, 支持为状态码(for codes 301, 302, 303, 307, and 308)跳转URL为其他的状态码返回返回体数据。返回体或者跳转的URL支持包含变量。特殊情况,重定向URL可以指定为该服务器的本地URI,在这种情况下,完整的跳转URL依据请求 scheme ($scheme) 和the server_name_in_redirect and port_in_redirect 指令。
例如:
请求重定向到一个新域名
location = /test {return 301 $scheme://www.example.com$request_uri;}
请求直接返回数据
location ^~ /getIP {default_type text/html;return 200 '[$remote_addr]';}
if
Syntax: if (condition) { … }
Default: —
Context: server, location
对特定的条件进行判断,如果为true,括号内将会被执行。
正则表达式匹配:
- =:等值比较;
- ~:区分大小写的正则表达式模式匹配
- ~*:不区分大小写的正则表达式模式匹配
- !~:区分大小写的正则表达式模式不匹配
- !~*:不区分大小写的正则表达式模式不匹配
文件及目录匹配判断:
- -f, !-f:判断指定的路径是否为存在且为文件;
- -d, !-d:判断指定的路径是否为存在且为目录;
- -e, !-e:判断指定的路径是否存在,文件或目录均可;
- -x, !-x:判断指定路径的文件是否存在且可执行;
例如:
if ($http_user_agent ~ MSIE) {rewrite ^(.*)$ /msie/$1 break;
}if ($http_COOKIE ~* "id=([^;]+)(?:;|$)") {set $id $1;
}if ($request_method = POST) {return 405;
}if ($slow) {limit_rate 10k;
}if ($invalid_referer) {return 403;
}
AND,OR多重判断
nginx的配置中不支持if条件的&& ||运算 ,并且不支持if的嵌套语法,但是我们可以用变量的方式来实现:
具体方法为AND 就用变量叠加,OR就用0或1切换。
例如我们的目标(伪代码):
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;
}