Nginx map 指令用于指定重定向以及重定向类型

Nginx map 指令用于指定重定向以及重定向类型

我通过编写此配置文件使重定向正常工作:

map $request_uri $new_uri {
    default https://github.com;
    /www http://wow.com;
    /?p=1 http://wow.com/p1;
}
server {
    listen 80;
    server_name TestDomain.com www.TestDomain.com;

    location / {
        if ($new_uri) {
            return 301 $new_uri;
        }
    }
}

现在,我还想控制每次重定向是 301 还是 302,因此我尝试这样做:

map $request_uri $new_uri {
    default https://github.com;
    /www http://wow.com;
    /?p=1 http://wow.com/p1;
}
map $request_uri $ret_code {
    default 302;
    /www 302;
    /?p=1 302;
}
server {
    listen 80;
    server_name TestDomain.com www.TestDomain.com;

    location / {
        if ($new_uri) {
            return $ret_code $new_uri;
        }
    }
}

但我似乎无法正确使用返回语句,invalid return code当我测试配置文件时,它会抱怨。如果变量中既有返回代码,又有 URL,我该如何指定最后一行?

此外,关于如何配置默认值的任何指针:

map $request_uri $new_uri {
    default https://github.com$request_uri;

因此默认重定向规则设置testdomain.com/whatevergithub.com/whatever

答案1

我不知道如何实现状态代码。

对于默认选项,您可以尝试以下操作:

map $request_uri $new_uri {
    default DEFAULT;
    ...
}

server {
    listen 80;
    server_name TestDomain.com www.TestDomain.com;

    location / {
        if ($new_uri = "DEFAULT") {
            return $ret_code https://github.com$request_uri;
        }
        if ($new_uri) {
            return $ret_code $new_uri;
        }
    }
}

答案2

通过使用多个来解决ifs

map $request_uri $new_uri {
    default DEFAULT;
    /www http://wow.com;
    /?p=1 http://wow.com/p1;
}
map $request_uri $ret_code {
    default 507;
    /www 302;
    /?p=1 301;
}
server {
    listen 80;
    server_name TestDomain.com www.TestDomain.com;

    location / {
        if ($new_uri = 'DEFAULT') {
                return 301 https://github.com$request_uri;
        }

        if ($ret_code = 301) {
            return 301 $new_uri;
        }

        if ($ret_code = 302) {
                return 302 $new_uri;
        }
    }
}

我会暂时搁置这个问题,看看它是否存在任何缺陷,以及是否有更好的方法来解决它。

相关内容