さくらレンタルサーバ(共用)に CakePHP2 で作ったアプリをデプロイしようとしてはまった話
やりたかったこと
- ドキュメントルート以外にアプリをインストール
- ドキュメントルートからはシンボリックリンクをはる
実際にシンボリックリンクを貼ってみる
SSH でログインし、おなじみの ln -s source dest
を叩く。
css や js といったディレクトリ系は問題なくリンクが貼れている。
しかし index.php や .htaccess といったファイル系はなぜか作成後にディレクトリアイコンになる。
この状態でアクセスするとエラーメッセージがでる。
オプションの s を外したハードリンクでは貼ることができたし、ちゃんとアクセスすることができた。
原因を検索してみたところ、そもそも共有サーバではシンボリックリンクが貼れない仕様らしい。
ナンテコッタ。
www 配下にデプロイして、ドキュメントルートを変えよう
仕方がないので www 配下にファイルをまるっと移動させる。
このままの状態だとライブラリとかのソースコードがノーガードなので、ドキュメントルートを変更してみる。
「マルチドメインとして使用する」にチェックが入っていても、初期ドメイン状態ではドキュメントルートを変更できないらしい!
ナンテコッタ。
もう普通に構築する
しかしここにも罠が。
.htaccess
をデフォルトから手を加えないといけないらしい。
以下のファイルの2行目をそれぞれ加筆する。
- /www/.htaccess
- /www/app/.htaccess
- /www/app/webroot/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /app
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /app/webroot
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
git などで clone してくると、サブフォルダが作られたりするので、そういう場合は、それぞれのファイルで /
を /sub/
に変更する。
終わってみて
共有サーバだからいろいろ制限あるのは仕方がないんだろうなぁ。
.htaccess の改変は割とよくあるので気にならないけど、シンボリックリンク禁止はセキュリティ的な観点からなのかな。
もし開発前からさくらの共有サーバを使うことが分かっていれば、あらかじめ webroot を分離した状態で構築するのが良いと思う。
分離させた開発はさくら以外にも使い道はあるだろうし。
分離させる際は app/webroot/index.php あたりをごにょごにょ書き換えれば良い。
Discussion