web-dev-qa-db-ja.com

クエリ文字列に%を含む.htaccessの書き換えが機能しない

私はからサイトの書き換えをしようとしています

http://www.example.com/folder/site?data%5Bbranch%5D=xyz

http://www.example2.com/test/

すでにクエリ文字列を試しましたが、%の問題に直面しています。助けがありますか?

2
Kevin

クエリ文字列と一致する必要がある場合、mod_rewrite RewriteCondディレクティブのQUERY_STRINGサーバー変数と比較する必要があることに注意してください。 mod_alias Redirect(またはRedirectMatch)またはRewriteRule(mod_rewrite)patternを使用してクエリ文字列と一致することはできません-これらはすべてURLと一致します-pathのみ。特にクエリ文字列を除外します。

それ以外の場合、クエリ文字列の%について特別なことはありません。%サーバー変数のリテラルQUERY_STRINGnotデコードされます) )。以下を試してください:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^data%5Bbranch%5D=xyz$
RewriteRule ^folder/site$ http://www.example2.com/test/? [R=302,L]

REQUEST_URIに一致する条件を使用するよりも、RewriteRulepatternでURLパスを一致させる方が効率的です。 RewriteRulepatternが最初に一致し、これが成功した場合にのみ条件(上記)が処理されます。

クエリ文字列値を二重引用符で囲む必要はありません。ただし、そのクエリ文字列だけに一致させる場合は、開始/終了アンカー(つまり、^...$)が必要です。 (または完全一致-辞書編集的に等しい-演算子プレフィックス、=、つまり=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リダイレクトでテストする方が簡単/安全です。または、ブラウザのキャッシュを無効にしてテストします。)

5
MrWhite

自分の質問に対する答えを見つけたようです。それが正しい方法だと思いますが、とにかく:

RewriteCond %{REQUEST_URI}  ^/folder/site$
RewriteCond %{QUERY_STRING} "data%5Bbranch%5D=xyz"
RewriteRule (.*) http://www.example2.com/test/
1
Kevin