【baserCMS】「さくらのレンタルサーバー」でインストールする場合の注意点

1年以上ぶりの超久々記事です。ゴメンナサイ…

案件で「さくらのレンタルサーバ」にbaserCMSをインストールすることになったのですが、「No input file specified.」というエラーが出てしまいインストーラーがステップ2から進めなくなる問題に遭遇しました。バージョンは「baserCMS3.0.6.1」です。ググるといくつか記事が出てきますが、最近のバージョンでも発生する問題ですのでちゃんと記事を書きました。

▼さくらインターネットでインストールできません
http://forum.basercms.net/modules/newbb/viewtopic.php?viewmode=flat&topic_id=25&forum=2

過去のフォーラムにも既に解決記事があるのですが、この中で重要なのが、php.iniに


cgi.fix_pathinfo = 1

を記述するというところで、ほかにもいろんな方法が列挙されていますが、この設定1つのみで回避できます。

変更する場所は、コントロールパネルの次の場所です。

baserCMS_sakura

さくらのPHP設定で、5.3系以降はcgi設定が古いままのようですね。

何故このようなことが起きるのかというと、baserCMSはスマートURLがOFFの状態では「ドメイン名/index.php/パス」というURLになり、index.phpというファイル名のあとにルーティングパスが付加されるため、CGI版PHPでは旧来の設定では問題がある、ということです。既に新しいPHPのインストール直後の設定ではここは1になっていて問題が起きない筈なんですが、さくら側が以前のバージョンからphp.iniをコピってきた互換性をとるためにこのような設定にしているんじゃないですかね。
なおbaserCMSのインストーラーはスマートURLが強制OFFのため、php.ini以外でこの問題を回避する手段がありません。ちなみにbaserのベースにもなっているCakePHPを素で利用する場合は、最初からModRewriteの設定がされており、このような問題は発生しません。

そろそろModRewriteが設定できないサーバを探す方が難しくなってきたので、スマートURLは常にONでもいい感じがしています。

【BaserCMS】テーマファイルを安全に配置する方法

BaserCMS関連のTips続編です。

とにかく導入が楽でお手軽に使える事を目指しているBaserCMSですが、一つだけ個人的に良くないかなーと思う点があります。「テーマ機能」を用いて簡単にデザインを変えられる機能がありますが、ビューファイル(*.ctp)もドキュメントルート内に置く仕様になっているため、ctpファイル単体が閲覧できてしまう問題があります。

例えばTopページのビューは、インストール直後は「/themed/demo/pages/index.ctp」にあります。なので「http://www.example.com/themed/demo/pages/index.ctp」とすると次のように見えてしまいます。

PHPの関数コールが分かってしまう

ソースコードが丸わかり。ビューにコードをいろいろ書いてしまうと危険!

これはあまり気持ちの良い事ではないので、ビューファイルだけは見えないところに移動してみましょう。
テーマファイルは「app/webroot/themed/」以外に「app/views/themed/」内においても動作をします。そこで次の対処を行います。

  1. 「app/views/」内に「themed」ディレクトリを作成する
  2. さらに、対処したいテーマ名のディレクトリを「themed」内に作成する。今回は「app/views/themed/demo/」となる
  3. 「app/webroot/themed/demo」内にある「elements」「feed」「leyouts」「pages」を「app/views/themed/demo/」内に移動する

なお、これが可能なのは「webrootをドキュメントルートとしている」場合のみです。ドキュメントルート内にBaserCMS本体を置いて運用されている方は対処する事が出来ません。(2011.01.26追記:「スマートURL」設定であれば、どのようなインストール方法でも上記は有効です)
また、上記対処をする事で問題点もあります。管理画面上でテーマファイルの編集が出来なくなりますので、別の方法でファイルを直接扱わなければならなくなります。まあもっともプログラマーの方でしたら特に問題はないでしょう。

もしビューファイルの拡張子がphpでしたらPHPコードとして実行されるためエラーコードがはき出されるのみですみますが、そうでない場合は普通にテキストファイルとして入手できてしまうので、場合によっては脆弱を生む事になります。
まあこれはBaserCMSに限った事ではなく、CakePHPを丸ごとドキュメントルート内において運用する場合にも起こりうる問題です。ビューにはあまりコードを書かないようにするか、ちゃんとwebrootをドキュメントルートにした上で、上記のようにthemedからビューファイルを外に追い出した方が安全でしょう。

とはいえ、システムの方で一応ディレクトリを分ける対応をした方が問題がなさそうな気がします。丸ごとインストールされているとまあどうしようもないのですが…

【追記】(2011.01.26)

@nojimageさんから「.htaccessにAddHandlarでctpも加えたら」というアイデアをいただきました(ありがとうございます!)。
もしお使いのサーバで「.httaccessの編集権」「AddHandlar使用権」がある場合は、ctpファイルをPHPコードと見なす事で、webroot内にctpファイルがあっても、コードの中身を閲覧する事を(一応)防ぐ事が出来ます。
「app/webroot/.htaccess」に次のように記述します。


#インストールしているPHP環境によって書き方が違うかもしれない(下記はPHP5用)
AddHandler php5-script .ctp
AddType text/html .ctp

たいていの場合、内部のメソッド・関数が見つからないために致命的エラーとなり、閲覧が出来なくなります。
また、ドキュメントルートに丸ごとBaserCMSをインストールしている場合は「/(BaserCMSのインストールディレクトリ)/.htaccess」に記述する事でBaserCMS内の全てのctpファイルを防げます。

【BaserCMS】app/webrootをドキュメントルートにする場合の注意点

いままでBaserCMSの話題が全くなかったので、ちょっと取り上げてみようと思います。

あ、そうでした。
4月頃、東京で「BaserCMSの勉強会」の開催をもくろんでいます。興味がありましたら是非ご参加ください。またお手伝いいただける方、会場をちょろっとお借りできる会社様等ありましたら是非ご協力お願いいたします。
このへんについてはまた後日。

で本題なのですが、Bakerの皆さんがCakePHPを扱う場合、おそらくapp/webrootをドキュメントルートとしてサーバ設定をする事が多いと思いますが、同じようにBaserCMSもこのように設定すると、インストーラ実行後、表画面もしくは裏画面のどちらかがうまく表示されなくなってしまうかと思います。BaserCMSは標準ではドキュメントルート内にアーカイブ一式をコピーする事を前提で設定がされているため、いくつかの箇所で不具合を生じてしまいます。

app/webrootをドキュメントルートにする場合は次のようにします。

■修正1:.htaccessを次のように設定する


RewriteEngine on
#↓ここを修正
#RewriteBase /app/webroot
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

■修正2:app/config/core.php内の次の箇所を変更する


//↓ここを修正
//Configure::write('App.baseUrl', env('SCRIPT_NAME'));
 Configure::write('App.baseUrl', '');

インストール後うまくいかないようでしたら、たぶんこの辺が影響していると思います。
是非ご確認ください。