Nginx - クエリ文字列パラメータに基づいてリダイレクトする

Nginx - クエリ文字列パラメータに基づいてリダイレクトする

nginx の設定で解決すべき少し複雑な問題があります。現在、ドキュメント ルートにソフトウェアがインストールされています。このソフトウェアは、コンテンツを表示するために単一のエントリ ポイント (index.php) とクエリ文字列を使用します。URL の例は次のとおりです。

/index.php?forums/forum-name.1
/index.php?threads/thread-name.1
/index.php?users/user-name.1

等...

ここで、このソフトウェアをサブディレクトリに移動し/f/、新しいソフトウェアをドキュメント ルートにインストールします。このソフトウェアも index.php を使用します (ただし、クエリ文字列は使用しません)。したがって、古いソフトウェアの URL のみを書き換える一連の書き換えルールを作成する必要があります。同時に、URL から index.php も削除します。マッピングの例は次のとおりです。

/index.php?forums/forum-name.1 --> /f/forums/forum-name.1
/index.php?threads/thread-name.1 --> /f/threads/thread-name.1
/index.php?users/user-name.1 --> /f/users/user-name.1

したがって、基本的には、index.php リクエストの特定のサブセット (?forums、?threads、?users などのみを含む) をリダイレクトし、index.php 部分を削除して /f/ ディレクトリに送信する必要があります。

私は午前中ずっとこれをいじっていましたが、思ったように動作させることができませんでした。

答え1

特にクエリ文字列が関係する場合など、複雑なリダイレクトを管理するには、mapディレクティブを使用できます。

および 式のクエリ文字列 ( 以降?)は正規化された URI の一部ではないため一致させることはできませんが、 にはクエリ文字列を含む元のリクエストが含まれます。locationrewrite$request_uri

$request_uriパラメータが一貫した順序で送信されない場合、一致に問題が発生する可能性があります。また、奇妙な文字を含む URI はパーセントエンコードされます。

ディレクティブmapは文字列や正規表現に一致させることができます。このドキュメント詳細については。

例えば:

map $request_uri $redirect {
    default                                               0;
    ~*^/index\.php\?(?<suffix>(forums|threads|users).*)$  /f/$suffix;
    ...
}

server {
    ...
    if ($redirect) {
        return 301 $redirect;
    }
    ...
}

常に使用する名前付きキャプチャブロック正規表現でmap。マップされた式はステートメントで評価されます。return私が理解している限りでは、nginx正規表現rewrite( 、一部のlocationブロック、一部の文など)ではif、数値キャプチャがリセットされます。名前付きキャプチャステートメントの範囲内にとどまるようにしますreturn

見るこの注意の使用についてif

関連情報