【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」で取得できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です