mod_rewrite でクエリ文字列をマッチさせる方法

mod_rewrite モジュールの RewriteRule ディレクティブはクエリ文字列を評価してくれない。

目次
  1. クエリ文字列付き URL の書き換え
  2. %{QUERY_STRING}
  3. 不要なクエリ文字列の除去

クエリ文字列付き URL の書き換え

いわゆる動的 URL は、疑問符 (?) 以降に諸々のパラメータが付随する形のアドレスですが、RewriteRule に記述したパターンではその箇所をマッチさせられません。

これを
http://example.com/?keyword=hoge
こう書き換えたい
http://example.com/keyword/hoge

けれどその時、次のような感じで RewriteRule を設定しても期待通りの動作にはなりません。

RewriteRule ^\?keyword=(.*) /keyword/%1

%{QUERY_STRING}

クエリ文字列を扱うには、環境変数を参照できる RewriteCond ディレクティブを使います。

RewriteCond %{QUERY_STRING} ^keyword=(.*)
RewriteRule ^$ /keyword/%1?

RewriteCond の第 2 引数がクエリ文字列の取得パターンになり、マッチした場合は次行の RewriteRule が実行されます。キャプチャした箇所はここで参照することが可能です。

不要なクエリ文字列の除去

上のコードで、RewriteRule の第 2 引数である置換文字列 /keyword/%1? の末尾に疑問符が付いています。これは、書き換え後に元のクエリ文字列を除去するための書き方です。

末尾に疑問符を付けず、R フラグでリダイレクトさせるとどうなるでしょう?

RewriteCond %{QUERY_STRING} ^keyword=(.*)
RewriteRule ^$ /keyword/%1 [R]

次のようなアドレスになります。

というわけで、リダイレクト後に付いてくる余計なクエリ文字列を削除したい場合、置換文字列末尾に「?」を書き加えます。

参考

今日学んだこと

mod_rewrite モジュールでのクエリ文字列の扱い方。マッチングには、RewriteRule ではなく RewriteCond ディレクティブを使用する。