「AddHandler」を使ってもCGIモードのPHPがうまく動かないことがある理由メモ
投稿日:2017年03月15日
最終更新日:
もくじ
- なぜ「AddHandler」だと動かないのか?
- 対処法…「SetHandler」+「FilesMatch」
なぜ「AddHandler」だと動かないのか?
私は、
- OS:CentOS7
- Apache2.4
- PHP7
/var/www/cgi-bin/hoge-cgi/php-cgiの中身は [VIM] #!/bin/sh exec /usr/bin/php-cgi [/VIM] となっており、example.comにアクセスが有った時、PHPがCGIモードで動くようにしたはずでした。しかし。
PHPはモジュールモードで動いていました。私が設定作業をしていたときには、「No input file specified.」と表示されたこともあります(原因は不明)。
なぜ「AddHandler」だとうまく動かないのか。その答えは、/etc/httpd/conf.d/php.confにありました。
[VIM]
sudo vim /etc/httpd/conf.d/php.conf
#中身を抜粋
AddHandlerもSetHandlerも、あるファイルに対してどのような操作を実行するかを設定する時に使います。AddHandlerはある拡張子に対して行う処理を追加しますが、SetHandlerは(普通に使えば)設定が適用されるディレクトリにある全ファイルに対して行う処理を指定し、既存の設定は上書きしてしまいます。SetHandlerのほうがAddHandlerよりも強いわけです。AddHandlerの設定は無視されてしまったのでした。
対処法…「SetHandler」+「FilesMatch」
この問題に対処するためには、こちらもSetHandlerを使ってPHPをCGIモード化する設定を施すことが有効です。ただ、SetHandlerを普通に使えば問答無用で全ファイルに対してPHPの処理が行われるので、事前に「FilesMatch」ディレクティブでPHPのファイルだけ取り出してからSetHandlerの設定を行います。
[VIM]
ScriptAlias /php-hoge /var/www/cgi-bin/hoge-cgi/php-cgi
「FilesMatch」ディレクティブで拡張子が.phpのファイルだけを取り出し、それに対してSetHandlerディレクティブでPHPをCGIモードで動かす設定を施します。
参考リンク