mod_rewriteでQueryStringを扱う

mod_rewriteはあまり使うことがないので、なかなか設定を覚えられず、毎回調べないといけない。

今回は、/do_something.cgi?id=123 を /do/something/123/ にリライトしたくて調べた。来週になったらもう忘れてそうなのでメモしておく。

まずRewriteRuleでは「?」以降はマッチ対象にならないということが分かった。RewriteCondを使ってQueryStringをマッチさせて、その後でRewriteRuleする。RewriteCondでマッチしたものは%変数に格納され、RewriteRuleで使える。

RewriteCond %{QUERY_STRING} id=(\d+)
RewriteRule ^/do_something.cgi /do/something/%1/ [R=301,L]

これで特に問題なくリライトはされるのだけど、リダイレクトされるURLには /do/something/123/?id=123 とQueryStringがそのまま残ってしまう。このQueryStringがリライト後に付かないようにするには最後に「?」を付ける。

RewriteCond %{QUERY_STRING} id=(\d+)
RewriteRule ^/do_something.cgi /do/something/%1/? [R=301,L]
Last updated on July 8, 2015