リダイレクトの種類とともにリダイレクトを指定するための Nginx マップ ディレクティブ

リダイレクトの種類とともにリダイレクトを指定するための Nginx マップ ディレクティブ

次の設定ファイルを作成することでリダイレクトが機能するようになりました:

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

しばらくこの質問を受け入れずに残しておき、何か落とし穴がないか、もっと良い方法があるかどうかを確認します。

関連情報