CakePHP / mod_rewriteでスラッシュ補完 | とんでもブログ ~ プログラマのWeb開発メモ (PHP, CSS, JavaScript)

CakePHP / mod_rewriteでスラッシュ補完

SEOを考慮したmod_rewriteの設定。

以下の動きになるようにしたかったんです。


---


http://xxx/abc

http://xxx/abc.html

http://xxx/abc/index/

http://xxx/abc/index.html


→ 上記全て http://xxx/abc/ に変換


http://xxx

http://xxx/index/

http://xxx/index.html


→ 上記全て 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

http://dxd8.com/archives/141/