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 の一部ではないため一致させることはできませんが、 にはクエリ文字列を含む元のリクエストが含まれます。location
rewrite
$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
。