Nginx 配置中,不支持 if 语句的嵌套,也不支持逻辑与、或运算。比如我们有一个需求,需要配置重定向,访问网站任何页面都跳转到指定页面。

以下两种常规写法都会报错:

if ($uri != "/archives/1665" && !-f $request_filename){
    rewrite ^/(.*)$ https://www.codesou.cn/archives/1665 redirect;
}

if ($uri != "/archives/1665"){
    if(!-f $request_filename){
        rewrite ^/(.*)$ https://www.codesou.cn/archives/1665 redirect;
    }
}

那么要怎么解决这个问题呢?其实我们可以使用变量的方式来变通/间接解决:

set $flag "";
if ($uri != "/archives/1665"){
    set $flag "${flag}1";
}
if (!-f $request_filename) {
    set $flag "${flag}1";
}
if ($flag = "11") {
    rewrite ^/(.*)$ https://www.codesou.cn/archives/1665 redirect;
}

怎么样,是不是换个思路也很简单。