Diretiva de mapa Nginx para especificar o redirecionamento junto com o tipo de redirecionamento

Diretiva de mapa Nginx para especificar o redirecionamento junto com o tipo de redirecionamento

Eu tenho redirecionamentos funcionando escrevendo este arquivo de configuração:

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

Agora, eu também gostaria de controlar se é 301 ou 302 a cada redirecionamento, então tentei fazer isso:

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

Mas não consigo acertar a instrução de retorno, ela reclama invalid return codequando testo o arquivo de configuração. Como faço para especificar a última linha se tenho o código de retorno e o URL nas variáveis?

Além disso, quaisquer dicas sobre como posso configurar o padrão para ser:

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

para que a regra de redirecionamento padrão seja definida testdomain.com/whatevercomo github.com/whatever?

Responder1

Não sei como implementar o código de status.

Para a opção padrão, você pode tentar isto:

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

Responder2

Resolvido usando múltiplos 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;
        }
    }
}

Deixarei a pergunta sem aceitação por um tempo para ver se há alguma armadilha nela e se há uma maneira melhor de fazê-lo.

informação relacionada