mod_rewrite クエリー文字列でパーセントがあるエンコードされるのを避ける

2022-07-19

「example.com/test.php?id=ID%2id1234」のようなクエリー付きのパラメータでmod_rewrite でリダイレクトをするときに「%」を含む場合に、「%2」が「%253」のように変更される場合があります

下記のmod_rewrite の設定では、「example.com/test.php?pid=1234」にアクセスすると「example.com/test.php?id=1234」にリダイレクトされます。

RewriteCond %{QUERY_STRING}  ^(.*&)?pid=(.*)
RewriteRule (.*) $1?id=%2 [R=301,L]

この時にパラメータに「%2」等のある場合は、「example.com/test.php?pid=pid%2abc」にアクセスすると「example.com/test.php?id=id%253abc」のように「%2」が「%253」のように変換されます。

リダイレクト時にパーセントがある場合にURLエンコードされる為です、これを避けるには「%」の前に「\」をつけて「\%」のようにすれば良いのですが、mod_rewrite のフラグで「NE」でも対応可能です

NE」のフラグは、".", “?", “%"などの特殊文字が"%25″のようにエンコードされるのを防ぎます

RewriteCond %{QUERY_STRING}  ^(.*&)?pid=(.*)
RewriteRule (.*) $1?uid=%2 [R=301,NE,L]