web-dev-qa-db-ja.com

mod_rewrite urlencoding既にurlencodeされたクエリ文字列パラメーター-これを無効にする方法はありますか?

いくつかの非常に基本的なmod_rewriteルールがあります。

_RewriteRule ^something.swf$ http://www.newdomain.com/something.swf [R=302,L]
_

mod_rewriteはその仕事をしているようで、ユーザーがアクセスしている場合:

_something.swf?param=value_、_http://www.newdomain.com/something.swf?param=value_に正しくリダイレ​​クトされます

問題はこの状況にあります:

_www.olddomain.com/something.swf?param=URL_ENCODED_VALUE
_

最終的に起こっているのは、mod_rewriteがそれを自分自身に取り込んでクエリ文字列パラメータを再エンコードすることです

そのため、ユーザーは次のようになります。

_www.olddomain.com/something.swf?param=URL_ENCODED_VALUE
_

リダイレクト先

_www.newdomain.com/something.swf?param=URL_ENCODED_VALUE_OF_URL_ENCODED_VALUE
_

そのため、最終的に二重にエンコードされた値になります。沸く!

このために\?(.*) ... _?$1_ルールを作成できることは理解していますが、クエリ文字列パラメーターをurlencodeしないようにmod_rewriteに指示する方法があるはずだと考えています...有効なパスは次のとおりであるため、2つのルールの使用を避けたい:

_something.swf (no query string)
_

そして

_something.swf?someparams...
_

そう、理想的には...単にmod_rewriteに伝えてください:クエリ文字列パラメーターのurlencodingはありません... _R=302_を介して新しいURLに直接パススルーしてください。

51
anonymous-one

これを実現する方法は、NE(エスケープなし)パラメーターを使用することです。

RewriteRule ^something.swf$ http://www.newdomain.com/something.swf [R=302,L]

実際に読んでください

RewriteRule ^something.swf$ http://www.newdomain.com/something.swf [R=302,NE,L]

これにより、mod_rewriteはエンコード/エスケープを行わずに、すべてのクエリ文字列値をそのままにします。

それと同じくらい簡単:)

100
anonymous-one