if指令

if指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置,其语法结构为:

if ( condition ) { ... }

其中:花括号代表一个作用域,形成一个if配置块,是条件为真时的Nginx配置;condition为判断条件(true/false)。

可以在server块或location块中配置该指令

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