[CakePHP] ドキュメントルート以外の場所にインストールした場合、cake/dispatcher.phpを修正する必要がある。

環境

この記事の内容は、Ubuntu 6.10, Apache 2.0.55, PHP 5.1.6, CakePHP 1.1.12.4205で確認しました。

問題の現象

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つつながります。他にも支障をきたす箇所があるかもしれません。より的確な対処方法が判明したら、また報告します。