CakePHPをDocumentRoot以外で利用する | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

テーマ:

CakePHPを利用する場合、そのサーバーのDocument Rootにインストールしてしまうのが一番手っ取り早いのですが、場合によってはDocument Rootを他のツールやコンテンツで利用したいために、他のパスで動作させたいということがあったりします。


ということで、元々Document Rootで動かしていたCakePHPを別のパスで動くようにお引越しした際の備忘録です。

環境は、CakePHP2.3.7+Apache2.2.15で動かしています。



CakePHPをDocument Root以外で動かす


まず、CakePHPは下記のパスにインストールされているとします。


/var/www/cakephp

DocumentRootでCakePHPを動かしていた頃のApacheの設定ファイル(httpd.conf)のVirtualHostは下記のようにしていました。


<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/cakephp/app/webroot
    ServerName www.example.com
    ErrorLog logs/error_log
    CustomLog logs/access_log combined
</VirtualHost>

DocumentRoot以外でCakePHPを動かすので、URL上でのCakePHPのパスを決めなくてはなりません。

今回は、「http://www.example.com/apps/」でCakePHPが動くように設定をしたいと思います。

合わせて、DocumentRootを他のコンテンツが表示されるように置き換えるので、まずはApacheの設定ファイルを下記のように編集します(編集後は要Apache再起動)。


<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/html
    ServerName www.example.com
    ErrorLog logs/error_log
    CustomLog logs/access_log combined
    Alias /apps/ /var/www/cakephp/app/webroot/
</VirtualHost>

これで、DocumentRootのパスはCakePHP以外のディレクトリに移り、Aliasによって/appsにアクセスがあるとCakePHPのディレクトリが参照されるようになります。


次に、CakePHPのインストールディレクトリ以下にある.htaccessファイルを編集します。

これは、下記の3つのパスにそれぞれ存在します。


/var/www/cakephp/.htaccess
/var/www/cakephp/app/.htaccess
/var/www/cakephp/app/webroot/.htaccess

追加する設定は、mod_rewriteの下記の設定で、URLの基点となるパスを指定しておきます。


RewriteBase /apps

例えば、/var/www/cakephp/app/webroot/.htaccessのファイルには下記のように設定します。


<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /apps
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

これだけで一通りの設定が完了です。


http://www.example.com/apps/コントローラ名/アクション名

にアクセスすれば、今までのページが見えるようになっているはずです。

ちなみに、画像ファイルやJavaScript、CSSなどのパスもそれぞれ/apps以下となるため、直接パスを書いているテンプレートやレイアウトファイルなどは一通り編集する必要があります



変更したURLを元のパスに戻す


これは余談ではあるんですが、今回の目的はDocumentRootを他のコンテンツのために明け渡したいということであって、決してURLのパスを変えたいというものではありません。

そこで、Apacheの設定ファイルに下記のようにAliasを設定することで、DocumentRootをCakePHPが使わなくても元々のパスを使い続けることができます。


Alias /apps/ /var/www/cakephp/app/webroot/
Alias /foo/ /var/www/cakephp/app/webroot/

/fooはCakePHPのコントローラ名です。

前述の設定により、通常は


http://www.example.com/apps/foo/bar


というアクセスをしなければならないのを、


http://www.example.com/foo/bar


という元々のパスに戻すことができます。

ただし、コントローラごとにAliasを設定しなくてはならないのと、CakePHPの画像ディレクトリ(/img)やJavaScriptディレクトリ(/js)やCSSディレクトリ(/css)などは一般的過ぎる名前のため、Aliasの設定はしないほうが無難かもしれません(他のDocumentRootを使うコンテンツと競合するので)


今回の設定変更は、先ほどのmod_rewriteでのRewriteBaseの追加により、http://www.example.com/foo/barのURLでアクセスをしてもベースとなるURLを/appsに置き換えられて内部的にリクエストが投げられるため、URLをごまかすことができます。

URLを変更する影響が大きい場合は、このように設定してもよいかもしれません。