私はからサイトの書き換えをしようとしています
http://www.example.com/folder/site?data%5Bbranch%5D=xyz
に
http://www.example2.com/test/
すでにクエリ文字列を試しましたが、%
の問題に直面しています。助けがありますか?
クエリ文字列と一致する必要がある場合、mod_rewrite RewriteCond
ディレクティブのQUERY_STRING
サーバー変数と比較する必要があることに注意してください。 mod_alias Redirect
(またはRedirectMatch
)またはRewriteRule
(mod_rewrite)patternを使用してクエリ文字列と一致することはできません-これらはすべてURLと一致します-pathのみ。特にクエリ文字列を除外します。
それ以外の場合、クエリ文字列の%
について特別なことはありません。%
サーバー変数のリテラルQUERY_STRING
(notデコードされます) )。以下を試してください:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^data%5Bbranch%5D=xyz$
RewriteRule ^folder/site$ http://www.example2.com/test/? [R=302,L]
REQUEST_URI
に一致する条件を使用するよりも、RewriteRule
patternでURLパスを一致させる方が効率的です。 RewriteRule
patternが最初に一致し、これが成功した場合にのみ条件(上記)が処理されます。
クエリ文字列値を二重引用符で囲む必要はありません。ただし、そのクエリ文字列だけに一致させる場合は、開始/終了アンカー(つまり、^
...$
)が必要です。 (または完全一致-辞書編集的に等しい-演算子プレフィックス、=
、つまり=data%5Bbranch%5D=xyz
を使用します。=
プレフィックスの後はすべて、正規表現ではなくリテラル文字列として扱われます)。
?
は、クエリ文字列をリクエストから削除するために、RewriteRule
置換の最後に必要です。そうでない場合、置換されたURLに渡されます。 URLを?
で終了すると、本質的に空のクエリ文字列が作成されます(?
自体は結果のURLに含まれません)。 (Apache 2.4+を使用している場合は、代わりにQSD
-Query String Discard-フラグを使用できます。)
L
フラグは、これが成功した場合、他のルールが処理されないようにします。これは通常、外部リダイレクトの場合に行うことです。
これが永続的なリダイレクトである場合は、R=302
(一時)フラグをR=301
に変更します。 R
フラグを明示的に使用して外部リダイレクトを強制しない場合、置換でabsolute URLを指定したため、暗黙的にリダイレクトされます。明示的であることが常に望ましい。 (NB:301 /パーマネントリダイレクトはブラウザによってキャッシュされるため、多くの場合、最初に302/tempリダイレクトでテストする方が簡単/安全です。または、ブラウザのキャッシュを無効にしてテストします。)
自分の質問に対する答えを見つけたようです。それが正しい方法だと思いますが、とにかく:
RewriteCond %{REQUEST_URI} ^/folder/site$
RewriteCond %{QUERY_STRING} "data%5Bbranch%5D=xyz"
RewriteRule (.*) http://www.example2.com/test/