[CakePHP] ドキュメントルート以外の場所にインストールした場合、cake/dispatcher.phpを修正する必要がある。
問題の現象
CakePHPを、ドキュメントルート以外の場所にインストールするとします。たとえば、CakePHPをホームディレクトリの直下にインストールし、app/webrootへのシンボリックリンクをpublic_html/cakeから張る、以下のような場合です。
/home/foo/cake/app/webroot
/home/foo/public_html/cake -> /home/foo/cake/app/webroot
このとき、CakePHPへ接続するURLはhttp://example.com/~foo/cakeになりますが、このURLにアクセスすると、文字は表示されるものの、スタイルシートなどが適用されません。また、scaffoldやcake/scripts/bake.phpで生成した画面でデータの登録や編集ができず、"CakePHP Rapid Development"のページが表示されます。
対処方法
以下のパッチを適用します。
--- cake/dispatcher.php.orig 2006-12-27 15:21:51.237944750 +0900 +++ cake/dispatcher.php 2006-12-27 17:11:11.749586750 +0900 @@ -402,7 +402,8 @@ return $base.$regs[0]; } else { - !empty($htaccess)? $this->webroot = $htaccess : $this->webroot = '/'; + $this->webroot = preg_replace('/index\\.php/i', '', env('SCRIPT_NAME')); + $base = $this->webroot; return $base; } }
ただし、これは対処療法的方法であり、完全ではありません。
対処方法への経緯
問題の画面のスタイルシートのURLをみると、/css/cake.generic.cssとなっています。そこから(何をどのように調べたのか忘れました)、コントローラのwebrootを設定するためには、cake/dispatcher.phpのwebrootを変更すればいいことが分かります。それで(具体的なやりかたは忘れましたが、様々な変数の値を表示させてみたところ)、上記の解決方法になりました。
ただし、上の方法では、cake/script/bake.phpで生成した画面から遷移するときのURLが、"/foo/cake//edit/1"のように、"/"が2つつながります。他にも支障をきたす箇所があるかもしれません。より的確な対処方法が判明したら、また報告します。