if指令
if指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置,其语法结构为:
if ( condition ) { ... }
其中:花括号代表一个作用域,形成一个if配置块,是条件为真时的Nginx配置;condition为判断条件(true/false)。
condition
可以支持以下几种设置方法:
变量名
如果变量的值为空字符串或者以“0”开头的任意字符串,if指令认为条件为false;
其他情况认为条件为true。
比如:
if ($slow) {
… #Nginx配置
}
相等判断
使用 “=”(等于)和“!=”(不等于)比较变量和字符串是否相等,相等时 if 指令认为条件为true,反之为false。
# 这里的字符串不需要加引号。
if ($request_method = POST) {
return 405;
}
正则表达式
使用正则表达式对变量进行匹配,匹配成功时 if 指令认为条件为true,否则为false。
变量与正则表达式之间用 “~”、“~*”、“!~” 或 “!~*” 连接:
“~” 表示匹配过程中对大小写敏感,“~*” 表示匹配过程中对大小写不敏感;
使用 “!~” 和 “!~*”,匹配失败时 if 指令认为条件为true,否则为false。
在正则表达式中,可以使用小括号对变量值进行截取,在花括号中使用 $1 … $9 引用截取的值。比如:
if ($http_user_agent ~ MSIE) {
# $http_user_agent的值中是否含有MSIE字符串,如果包含,为true
……
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
# Nginx配置,可以使用$1和$2获取截取到的值。如:
# set $id $1; 将截取到的id赋值给 $id 变量以备后用。
……
}
注意:整个正则表达式字符串一般不需要加引号,但如果含有右花括号 “}” 或者分号 “;” 字符时,必须要给整个正则表达式添加引号。
文件是否存在
“-f” 和 “!-f”
判断请求的文件是否存在使用 “-f” 和 “!-f”。
当使用 “-f” 时,如果请求的文件存在,if指令认为条件为true;如果请求的文件不存在为false;
使用 “!-f” 时,
如果请求的文件存在,也为false;
如果请求的文件不存在但该文件所在的目录存在,if指令认为条件为true;
如果该文件和它所在的目录都不存在,则为false。
if (-f $request_filename) {
# 判断请求的文件是否存在
……
}
if (!-f $request_filename) {
# 判断请求的文件是否不存在
……
}
“-d” 和 “!-d”
判断请求的目录是否存在使用 “-d” 和 “!-d”。
当使用 “-d” 时,如果请求的目录存在,if指令认为条件为true;如果请求的目录不存在,则为false;
当使用 “!-d” 时,
如果请求的目录存在,为false
如果请求的目录不存在但该目录的上级目录存在,if指令认为条件为true
如果该目录和它的上级目录都不存在,则为false
“-e” 和 “!-e”
判断请求的目录或者文件是否存在使用 “-e” 和 “!-e”。
当使用 “-e” 时,如果请求的目录或者文件存在时,if指令认为条件为true,否则为false。
当使用 “!-e” 时,如果请求的文件和该文件所在路径上的目录都不存在,为true,否则为false。
“-x” 和 “!-x”
判断请求的文件是否可执行使用 “-x” 和 “!-x”。
当使用 “-x” 时,如果请求的文件可执行, if指令认为条件为true,否则为false;
当使用 “!-x” 时,如果请求的文件不可执行,为true,否则为false。
Last updated
Was this helpful?