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