【Apache】htaccessのRewriteでGETパラメータも残す


nginxが台頭してきている今日この頃。Apacheの話です。
少しハマったのでメモします。

■環境
CentOS 6.6
httpd 2.2.15

htaccessにてリダイレクト処理を記載する際、
以下のように書くとGETパラメータがリダイレクト時に落ちてしまいます。

RewriteEngine on}  
RewriteBase /  
RewriteRule ^api.php(.*)$ api2.php$1  

例えば、このまま「https://sample.com/api.php?name=tanaka」にアクセスすると
リダイレクト後は「https://sample.com/api2.php」となってしまいます。

RewriteでGETパラメータを扱いたい場合は、『RewriteCond』を使って以下のように記載します。

RewriteEngine on  
RewriteBase /  
RewriteCond %{QUERY_STRING} (.*)$  
RewriteRule ^api.php$ api2.php?%1  

これで「https://sample.com/api.php?name=tanaka」にアクセスすると
リダイレクト後は「https://sample.com/api2.php?name=tanaka」となります。
※RewriteRuleの右側「$1」ではなく「%1」です。間違えないように。

何が起こっているかというと、RewriteCondの『QUERY_STRING』で指定した正規表現に一致する
GETパラメータが%変数に格納されているようです。
例えば以下のような記載もできます。

RewriteEngine on  
RewriteBase /  
RewriteCond %{QUERY_STRING} name=(.*)$  
RewriteRule ^api.php$ api2.php?onamae=%1  

これで「https://sample.com/api.php?name=tanaka」にアクセスすると
リダイレクト後は「https://sample.com/api2.php?onamae=tanaka」となります。

正規表現で複数パラメータを取ることも可能なので、

RewriteCond %{QUERY_STRING} param1=([a-z]+)&param2=([a-z]+)&param3=([a-z]+)$  

と記載すれば、param1は「%1」、param2は「%2」、param3は「%3」で取得できます。