CakePHP2.1をさくらのレンタルサーバー+マルチドメイン使用でデプロイ
ウキウキでリリースのところ、予想外のトラブルに見舞われました…
サーバーはさくらのレンタルサーバースタンダード。Apacheは1.3。ドメインはスタードメインで取得したものを、さくらのマルチドメイン機能で使用。
http:// mydomain.comで、CakePHPのrootに接続するようにします。
マルチドメイン設定
ディレクトリ構造とCakeのindex.php設定
ディレクトリ構造はこんな感じ。wwwがさくらデフォルトのApacheDocumentRootディレクトリです。
/user_name
/lib
/Cake2.1(core)
/myapp(app)
/www
/myapp(webroot)
さくらのマルチドメイン機能では、追加したドメインごとにDocumentRootを設定します。ただしwww以下という制約があり、appを公開フォルダ上に置くのを避けるには、appとwebrootの位置関係を変えざるを得ないです。
myapp(webroot)/index.phpは以下のように変更。
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って体感できるレベルで遅くなりますね…
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を公開ディレクトリ上におく情報が多かったので参考までに。
ちなみに現在は、全て手動で書き換えて上げています。早く自動化しなければ。