CakePHP / mod_rewriteでスラッシュ補完
SEOを考慮したmod_rewriteの設定。
以下の動きになるようにしたかったんです。
---
→ 上記全て http://xxx/abc/ に変換
→ 上記全て http://xxxxx/
に変換
---
で、ようやくできました。
/cakeroot/app/webroot/.htaccess を以下のように設定すればOK
RewriteEngine On
# ここにはCakeRootのパスをいれる
RewriteBase /cakeroot
# 末尾のindex.htmlを取り除く
RewriteCond %{REQUEST_URI} /index.html?$
RewriteRule ^(.*)index.html?$ $1 [R=301,L]
# 末尾のindexもしくはindex/を取り除く
RewriteCond %{REQUEST_URI} /index/?$
RewriteRule ^(.*)index/?$ $1 [R=301,L]
# 末尾が.htmlもしくは.htmで終わっていればスラッシュに置換する
RewriteRule ^(.*)\.html?$ $1/ [R=301,L]
# 末尾がスラッシュで終わっていない場合、
# かつファイル拡張子がついていない状態の場合は
# スラッシュ補完する
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule ^(.*)$ $1/ [R=301,L]
# 以下Cakeデフォルト
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
いや、本当に苦労しました。
正直mod_rewriteの設定で、こんなに苦労するとは思いませんでした。
コントローラ内で振り分けすることもできましたが、コントローラ毎に何か設定する要素が増えそうで嫌だったので、mod_rewriteでなんとかすることにしました。
何かありましたらご指摘いただけると嬉しいです。
【参考URL】
http://d.hatena.ne.jp/happy-lucky/20080210/p1