XREAでEC CUBEを動作させるときにsafe_modeの制限を回避する方法
はっきり言ってXREAにもEC CUBEにもあまり関わりたくないのですが、そういう話が来てしまうので仕方ありません。 今回はEC CUBEパージョン1系の話です。 何も考えずにXREAにEC CUBEを載せた場合、Apacheモジュールとして動作するsafe_mode onのPHP上で動作することになります。 これで一見普通に動作するように見えるのですが、XREAではApacheモジュールのPHPによって生成されたファイルは所有者がapacheユーザとなる仕様となっており、さらにsafe_modeがonなのでそれらのファイルが既存のPHPのスクリプトから読み込めないという問題が起きます。 (safe_mode onではファイルの所有者(uidもしくはgid)が違うとオープンできない。) つまり、例えば管理画面のページ詳細設定からページを追加してもそのページが実際に表示できないということになります。 (バージョン2系は知りませんが、ページ詳細設定では実は追加だけでなく更新でも内部で一旦削除してから作成しなおしてるようで、更新だけでも同じ問題が発生します。) この問題をXREA上で回避するには、safe_modeがoffとなるCGIモードでPHPを動作させる方法があります。 なぜCGIモードではsafe_modeがoffになるかというと、XREAの場合はCGIモードのPHPはsuEXEC環境、つまりユーザ権限で動作するので、ファイルの読み書き権限をOS側で設定されたパーミッションにより判定できるからです。 逆にApacheモジュールモードでは全てのユーザーのスクリプトがapacheユーザ権限で動作してしまうために、apacheユーザからアクセスできるファイルにはどのユーザの物であろうとアクセス出来てしまうためにsafe_modeがonになっています。 ちょっと話がそれましたが、XREA上でCGIモードでPHPを動作させる方法はググればすぐ出てくるのですが、せっかくなので書いておきます。 XREAではドキュメントルートの.htaccessに以下の一行を記述するだけで配下の.phpファイルをCGIモードで動作させることが出来ます。 AddHandler application/x-httpd-phpcgi .php ディレクトリを分けてる場合はもちろんドキュメントルートじゃなく、適用したいディレクトリのトップに設置するだけでもOKです。 これによりPHPにより生成されたファイルにアクセスできない問題が解決するのですが他の問題が起きます。 XREAではCGIモードのPHPでは、magic_quotes_gpcがonになってしまうのです。.htaccessに「php_flag magic_quotes_gpc off」と書こうが反映されません。 EC CUBE側ではmagic_quotes_gpcの違いを吸収する作りにはなってないので、例えば管理画面のページ詳細設定からhtmlソースをPOSTしようとするとダブルクオーテーションがエスケープされて正常に表示されなくなったりします。 この問題を回避するには以下の一行を記述したphp.iniファイルを置いておけばいいのですが、 magic_quotes_gpc = off このphp.iniファイルはスクリプトが動作するディレクトリに置いておく必要があります。 EC CUBEで作ったサイトのURLを注意深く見た人なら分かると思いますが、EC CUBEはルートのindex.phpでディスパッチするような作りにはなっておらず、実に様々なディレクトリで動作するようになっています。 そう、必要なディレクトリ全てにphp.iniファイルを設置するのはすごく面倒なのです。 というか、どのディレクトリにphp.iniを設置すべきか否か洗い出すこと自体が面倒です。 そこでphp.iniが設置され過ぎてても問題ないだろうという考えから、全てのディレクトリに設置することにしました。 でまず、再帰的にディレクトリの一覧を作成する方法ですが、今回はこういう風にしました。 ls -R | grep / > directorylist.sh これでカレントディレクトリからサブディレクトリの中まで含めたディレクトリだけのリストが取得できます。 あとは生成したdirectorylist.shを編集して、ルートに作成しておいたphp.iniをcpコマンドで各ディレクトリにコピーするスクリプトを作成し実行するだけです。 一応今回作成したスクリプトがどんなものか頭の方だけ載せておきます。実際はこんな調子で250行以上になります。 秀丸で2回だけ置換して行頭を付け足して作成しました。所要時間約30秒。 #!/bin/bash cp ./php.ini ./abouts/php.ini cp [...]
Read the rest of this entry »