语法:if(condition){...}
作用域:server,location

nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。该模块需要PCRE支持,应在编译nginx时指定PCRE源码目录。if语句主要用来判断一些在 rewrite 语句中无法直接匹配的条件,比如检测文件存在与否,http header,cookie等

if条件(conditon)可以是如下任何内容

  • 一个变量名;false如果这个变量是空字符串或者以0开始的字符串;
  • 使用= ,!= 比较的一个变量和字符串
  • 使用~, ~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用" 或' 包围
  • 使用-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;
 }

当在location区块中使用 if 指令的时候会有一些问题, 在某些情况下它并不按照你的预期运行而是做一些完全不同的事情. 而在另一些情况下他甚至会出现段错误. 一般来说避免使用 if 指令是个好主意.

要着重注意的是if的行为不是反复无常的, 给出两个条件完全一致的请求, Nginx并不会出现一个正常工作而一个请求失败的随机情况, 在明晰的测试和理解下 if 是完全可用的. 尽管如此, 在这里还是建议使用其他指令.

在location区块里if指令下唯一100%安全的指令应该只有:

return …;
rewrite … last;

If 多重判断

nginx的配置中不支持if条件的逻辑与/逻辑或运算 ,并且不支持if的嵌套语法,我们可以用变量的方式来实现:

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;
}

results matching ""

    No results matching ""