.htaccessを使いローカル環境はそのまま、coreserverではCGIモードに設定する方法

CakePHPのちょっとしたアプリをcoreserverに設置したら、セーフモードのせいで画像アップロードが出来ませんでした。そういえばcoreserverCGIモードにしないとセーフモードだったのを思い出して、htaccessで設定したんですが、そのままだとローカル環境で動かなくなってしまうので困りました。coreserver用の設定は、ローカル環境では想定外の設定で、phpスクリプトphpとして処理されずに、そのままダウンロードされてしまいます。とはいえ、coreserverに設置する際、一部のファイルはアップロードしないといったルールを作るのは、ミスの原因になるのでやりたくありません。なので、何とか同じ.htaccessで、ローカル環境でもcoresserverでも動くような書き方を探ってみました。

今回使った解決策

<IfModule mod_phpcgicgiwrap.c>
<Files index.php>
    AddHandler application/x-httpd-php5cgi .php
</Files>
</IfModule>

多分ですが mod_phpcgicgiwrap.c はcoreserver*1の独自のモジュールだと思います。mod_phpcgicgiwrap - Google 検索の通りまったく検索で出てきません。ローカルには当然このモジュールは無いので、このモジュールがある場合のみCGIモードに設定する設定です。ローカル環境とcoreserverでは他にもモジュールの導入状況に違いがあったけど、どこかで提供されているものだと、今後忘れた頃にローカル環境に導入しないとも限りません。

なお、CakePHPなのでindex.phpだけ指定してます。

注意点

実はこの記述には問題があり、coreserverがこのモジュールを廃止したり、別名のモジュールに置き換えたりすると、知らない間にCGIモードが解除されてしまうという事です。より安全にするには、特に何もしないモジュールを自作して、確実にかぶらない名前でローカル環境に組み込むのが良いかもしれません。

CGIモード、モジュールモードのどちらで動いているかを確認する
<?php phpinfo();

phpinfo()でServer APIApacheならモジュールモード、CGIならCGIモード。もしかするとバージョンによっては表記が違うかもしれないけど、大体そこ見れば分かる表記にはなってると思います。

多分、より一般的な方法

<IfDefine !DEV>
<Files index.php>
    AddHandler application/x-httpd-php5cgi .php
</Files>
</IfDefine>

ローカル環境で定数DEVを設定しておいて、<IfDefine>を使って分岐する方法です。こっちの方法のほうが一般的かもしれません。

apachectl -D DEV -k start

この定数は、apacheを起動する際のオプションで設定できるので、ローカル環境の起動コマンドにこんな感じに-D DEVを追加します。

この方法なら、mod_phpcgicgiwrap.cが無くなるような事も無いし確実といえば確実なんですが、MAMPだとGUIから起動するのでもしかしたら面倒な事になるかなと思って敬遠しちゃいました。apacheを起動するシェルスクリプトは /Applications/MAMP/bin/startApache.sh にあるんですが、もしかしたらGUIからもこれを呼んでるかも?試してはいません。今回設置したアプリがちょっとしたものなので、ローカル環境をいじりたくなかったというのも・・・

ダメだった方法

SetEnvIf Server_Addr 127.0.0.1 dev
<Files index.php>
    AddHandler application/x-httpd-php5cgi .php env=!dev
</Files>

環境変数を使えば出来るじゃないかと思ってやってみたんですが、env=devとかが出来るのは一部のディレクティブだけみたいです。よく見かけるのは Allow とか CustomLog とか。あんまりApacheのディレクティブに詳しくないので、何でも環境変数での分岐が出来ると思ってました。AddHandler は使えないようです。

環境

ローカル
Mac Mac OS X 10.5.8(Leopard
MAMP 1.7.2
Apache 2.0.59
php 5.2.6
coreserver
Apache 1.3.37
php 5.2.5

*1:XREAにもあるかも?