サーバで稼働しているモジュール版PHPとは別バージョンのPHPを動作させる必要がある場合に、CGI版PHPを利用することが良くあります。
弊社スタッフの一人が例によってCGI版PHPをインストールしていたのですが、CGI版として動作させるPHPのconfigureが悪いのか、パスの設定が悪いのかうまく動作しないことがありましたので紹介いたします。
弊社スタッフの設定内容
弊社スタッフが行った作業は以下の通りです。
- 設定したいPHPのソースファイルを持ってきてCGI版PHPが使用できるように「–enable-cgi」オプションを付けてインストールした。
- Apache設定で特定ディレクトリに対してScriptAliasを設定し、CGI版PHPの実行ファイルを持ってきた。
- CGI版でPHPを動作させたいディレクトリで、.htaccessを使用しAddHandlerで.phpをマッピングした。
ところが実際に他のサーバで動作実績もあったにも関わらず、CGI版PHPが動作しない事態となりました。
ちなみに設置した.htaccessは以下の通りです。
1 2 3 4 5 |
# vi .htaccess ---------------------------------- Action php5-script /php-bin/php-cgi AddHandler php5-script .php ---------------------------------- |
上手くいった設定方法
AddHandlerではなく、SetHandlerで.htaccessに設定したところ、動作しました。
1 2 3 4 5 6 7 |
# vi .htaccess --------------------------------------- Action php5-script /php-bin/php-cgi <filesMatch "\.php$"> SetHandler php5-script </filesMatch> --------------------------------------- |
原因
なぜAddHandlerはダメでSetHandlerは動作したのでしょうか。
結論から言うと、AddHandlerよりもSetHandlerの方が優先されるため、.htaccessで.phpに対しAddHandler設定を行っても無視されてしまったことになります。
察しの良い方はすぐお分かりかと思いますが、RPMでインストールしたPHP5.6が生成するApache設定ファイルに以下の記述がありました。
1 2 3 4 5 6 7 |
# vi /etc/httpd/conf.d/php.conf --------------------------------------- (途中略) <filesMatch \.php$> SetHandler application/x-httpd-php </filesMatch> --------------------------------------- |
今回インストールしたPHP5.6では、PHPのハンドラをマップする際にAddHandlerではなくSetHandlerを使っていました。
AddHandlerとSetHandlerの違い
では、AddHandlerとSetHandlerはどのように違うのでしょうか。
Apache公式ページによるとAddHandlerとSetHandlerは以下のように説明されています。
両方ともハンドルをマップする際に使用されますが、AddHandlerは拡張子に対してマップさせるのに対して、SetHandlerは特定のファイルに対してマップさせる違いがあります。また、SetHandlerはデフォルトのハンドラをオーバーライド(上書き)するという特徴があります。
まとめ
理由が分かってしまえばなんてことない設定ですが、設定に慣れていれば慣れているほど見落としやすいところかもしれません。
もしCGI版PHPがうまく動作しない方がいらっしゃれば、お試しください。