apacheのVirtualDocumentRootとCakePHPの組み合わせで起こる怪現象を撃破する
会社でテストサイトを作る時、apacheの名前ベースのバーチャルホスト、特にVirtualDocumentRootを用いてさくさくとホストを追加できるようにしておく事も多いかと思う。
さて、そのVirtualDocumentRootなバーチャルホストにてCakePHPを用いてサイト構築を行う時に不可思議な現象に見舞われた。
CakePHPをWebサイトに展開すると、CakePHPのルートには.htaccessが自動的に配置され、それには以下のようなrewriteが書かれている。
RewriteEngine on RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L]
もちろんApacheのmod_rewriteとかAllowOverride Allなんてのは前提条件だ。
これが普通のバーチャルホストだと普通に動作するが、VirtualDocumentRootで構築したバーチャルホストの場合、
http://cakeapp1.example.com/caketest/
などというURLで動くように配置してアクセスすると、なぜか404が返ってくる。しかも、その時に報告される(見つからなかった)パスが
/var/www/site/cakeapp1/caketest/app/webroot/
などとなっている。根本的な原因は分からないが、エラーログに吐き出される内容が
File does not exist: /var/www/site/cakeapp1/var/www/site/cakeapp1/caketest/app/webroot/
となっていたため、Baseを指定するんだろうなという事で、CakePHPルート、app、app/webrootの.htaccess全てに適切なRewriteBaseを設定する事で解消できた。
RewriteEngine on RewriteBase /caketest/ RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L]
appだとRewriteBase /caketest/app/を設定、app/webrootだとRewriteBase /caketest/app/webrootを設定する。
いちいちこのような設定をしないといけないのは面倒だが、公式サイトに
> 既にmod_rewriteを活用しているその他のURL構造にインストールしているなら、
> RewriteBaseステートメントをCakePHPが使う.htaccessファイル
> (/.htaccess、/app/.htaccess、/app/webroot/.htaccess)に追加する必要があります。
とあるので、VirtualDocumentRootはmod_rewriteの機能を使っているのかも知れない。
CakePHPを触った(ブログチュートリアルを一通りやってみた)感想だが、宣言よりも規約という考え方自体は賛成できるが、複数形と単数形という考えが気持ち悪い。JavaのS2Daoのようにキャメルケースとアンダーバー区切りで機械的にマッピングとかの方がよっぽど分かりやすいと思うのだが・・・・。特にPersonの複数形がPeopleなのが気持ち悪い。まぁPersonsでいいのかという話もあるだろうけど。