Директива 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;
        }
    }
}

Но я не могу правильно сделать оператор return, он жалуется, invalid return codeкогда я тестирую файл конфигурации. Как мне указать последнюю строку, если у меня есть и код возврата, и URL в переменных?

Также, есть ли какие-либо указания о том, как мне настроить параметры по умолчанию следующим образом:

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

поэтому правило перенаправления по умолчанию установлено следующим образом testdomain.com/whatever: github.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;
        }
    }
}

Я оставлю этот вопрос открытым на некоторое время, чтобы посмотреть, есть ли в нем какие-либо подводные камни и есть ли лучший способ сделать это.

Связанный контент