CakePHP2.1をさくらのレンタルサーバー+マルチドメイン使用でデプロイ

ウキウキでリリースのところ、予想外のトラブルに見舞われました…
サーバーはさくらのレンタルサーバースタンダード。Apacheは1.3。ドメインはスタードメインで取得したものを、さくらのマルチドメイン機能で使用。
http:// mydomain.comで、CakePHPのrootに接続するようにします。

今回の内容

マルチドメイン設定

さくら側の設定

サーバーコントロールパネルの「ドメイン設定」→「新しいドメインの追加」で、ドメイン名とDocumentRootの指定をします。今回は www/myapp(webroot) に設定。

ドメインレジスタ側の設定

ネームサーバーの設定をさくら指定のものに書き換えます。待ち時間はケースバイケースですが、1時間後には設定したドメインでアクセス可能になりました。

ディレクトリ構造とCakeのindex.php設定

ディレクトリ構造はこんな感じ。wwwがさくらデフォルトのApacheDocumentRootディレクトリです。

/home
    /user_name
        /lib
            /Cake2.1(core)
        /myapp(app)
            /www
        /myapp(webroot)


さくらのマルチドメイン機能では、追加したドメインごとにDocumentRootを設定します。ただしwww以下という制約があり、appを公開フォルダ上に置くのを避けるには、appとwebrootの位置関係を変えざるを得ないです。
myapp(webroot)/index.phpは以下のように変更。

# 変更前 define('ROOT', dirname(dirname(dirname(__FILE__))));if (!defined('ROOT')) {
  define('ROOT', DS . 'home' . DS . 'user_name');
}

# 変更前 define('APP_DIR', basename(dirname(dirname(__FILE__))));if (!defined('APP_DIR')) {
  define('APP_DIR', 'myapp');
}

# コメントを外す
define('CAKE_CORE_INCLUDE_PATH',  DS . 'home' . DS . 'user_name' . DS . 'lib' . DS . 'Cake2.1' . DS . 'lib');

この時点でのエラー

ブラウザ : NOT FOUND
Apacheエラーログ : File does not exist
root(http://mydomain.com)だけは正しく表示。Cakeのroutes.phpでrootのアクションを変更すれば、そのアクションは動作する状態に。

.htaccessの設定

制約の範囲と内容が不明瞭なのですが、今回のケースでは、実際のファイルディレクトリ構造とリクエスURIの構造が異なる場合アクセスできないようです。

対処法

myapp(webroot)内に、下記を記載した.htaccessを設置します。しかし.htaccessって体感できるレベルで遅くなりますね…

<IfModule mod_rewrite.c>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

    RewriteBase /

</IfModule>
無事全てのページが表示されるようになりました。
本来CakePHPで解釈されるroot以降の部分を、事前にクエリストリングに書き換えてから渡すようにRewriteRuleを設定したわけです。
RewriteCondは適用条件を指定するもので、!-fは実際に存在するファイル名を除外するという意味です。画像やCSSに書き換えが適用されないようにしています。

.htaccessを設置したが書き方が間違っていた時のエラー

ブラウザ : Internal Server error
Apacheエラーログ : mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.
なお、RewriteOptions MaxRedirectsを1~15まで設定してみましたが、エラーは解決しませんでした。

検索すれば似た事例が出ますが、古いバージョンの情報だったりCakeを公開ディレクトリ上におく情報が多かったので参考までに。
ちなみに現在は、全て手動で書き換えて上げています。早く自動化しなければ。