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オプションは外すように注意してください。