CGI/PHPがダウンロードされる、思いのほか強力なSetHandlerに関して

シェアする

Voiced by Amazon Polly

Apache上でPHPを動作させる場合、モジュール版かCGI版で動作させることができますが、ある日特定のサーバー上でCGI版PHPが動作しなくなり、ソースがダウンロードされるようになってしまいました。

広告



チェックリストを確認する


apache2でcgiがダウンロードされる時のチェック項目一覧 – 余白の書きなぐり
で紹介されている次の方法を試したものの、なぜか変化がありませんでした。

AddHandlerしたか ?
AddTypeしたか?
OptionでExecCGIしたか?
a2enmodを有効化したか?
設定終えた後restartしたか?
cgiのパーミションは大丈夫か?
cgiを設置したディレクトリのパーミションは?
cgiスクリプトの表示内容は正しいか?

複数のバージョンを混在利用している

ppa:ondrej/phpリポジトリからPHPをインストールしている場合、phpパッケージだけではなくphp-cgiおよびphp-fpmパッケージのインストールも必要です。
インストールされていない場合、PHPがブラウザ上へダウンロードされ動作しません。
現時点では、php5.6 php7.0 php7.1 php7.2 php5.6-cgi php7.0-cgi php7.1-cgi php7.2-cgi php5.6-fpm php7.0-fpm php7.1-fpm php7.2-fpmが提供されています。

現在サポート期限の切れているPHP5.5以前に関しては、提供されていません。PHP5.5以前に対するセキュリティサポートは終了しています。また、使用しているホストがもしあるならば速やかに使用を中止するか、PHP5.6以上にアップグレードしてください。

SetHandlerが邪魔をしていた

モジュール版PHP側の設定ファイル(php(x.x).conf)にSetHandlerディレクティブが指定されており、バーチャルホストごとのAddHandler設定が無視された帰結として動作しない状況になっていました。
当該記述のコメントアウトにより、解決しました。
本来はすべての記述をSetHandlerにより記述することがセキュリティ上推奨されているようですが、現在利用している管理ソフトがAddHandlerを使用するため、暫定対応になります。

SetHandlerとAddHandlerの違い

SetHandlerでは、記述された対象すべてに対してハンドラーを適用します。実際に使用する場合はFilesMatchディレクティブと併用して、効果範囲を制限する必要があります。
書式は、SetHandler (ハンドラー)です。
AddHandlerでは、指定された拡張子に対してハンドラーを適用します。
書式は、AddHandler (ハンドラー) (拡張子)です。

異なる設定ファイルであってもSetHandlerとAddHandlerがいずれも同一の対象に対して適用されている場合、SetHandlerが優先されます。