Get変数を渡すページをCakePHPのURL形式へ変換する.htaccess(mod_rewrite)の記述方法

これまでSmartyなどを使っていたウェブサイトをリファクタリングし、CakePHPへ移行する場合などに困ることがとして。
Get変数を使ったページを、CakePHP特有のURL記法(host/Controller/Action/Var)へ変更する際、
.htaccessを使って、リダイレクトする必要がある。

CakePHPのなかには、.htaccessがデフォルトで3つ含まれている。

結論から話すと、/webroot/直下の.htaccessにリダイレクトの処理を追加することとなる。

デフォルトでは以下のようになっている。

/webroot/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Redirectそのもの解説として、おせっかいながら各行の意味を説明すると

<IfModule mod_rewrite.c>
# Apache が mod_rewrite モジュールを使用できるかどうか
    RewriteEngine On
    # mod_rewrite を有効にする
    RewriteCond %{REQUEST_FILENAME} !-d
    # リクエストしたURLのディレクトリが存在しない場合は
    RewriteCond %{REQUEST_FILENAME} !-f
    # リクエストしたURLのファイルが存在しない場合は
    RewriteRule ^(.*)$ index.php [QSA,L]
    # index.php へRedirectする
</IfModule>


ここに、今回はget変数でIDを渡していたページを、CakePHPのURLの記述へ変更。
かつ、idが変更になった場合の処理を例示します。

<IfModule mod_rewrite.c>
    RewriteEngine On

    # redirect the access to 
    
    RewriteCond %{REQUEST_URI} jump.html
    # jump.html に対して

    RewriteCond %{QUERY_STRING} ^id=4
    RewriteRule ^(.*)\.html$ $1/8? [NE,R=301,L]
    # hoge.html?id=4 へのアクセスを hoge/8 へリダイレクトする
    # RewriteRule末尾の"?"はQueryStringを後ろへ付けないの意味

    RewriteCond %{QUERY_STRING} ^id=(\d+)
    RewriteRule ^foo.html$ foo/%1? [NE,R=301,L]
    # foo.html にアクセスしてきたGet変数を、"/"以下に付加する
    # ex. foo.html?id=48 -> foo/48
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

なおRewriteRuleのQSAオプションは、{QUERY_STRING}を渡してしまうため、Redirect先のURLに
QSAオプションは外すように注意してください。