「AddHandler」を使ってもCGIモードのPHPがうまく動かないことがある理由メモ

このページでは、PHPをCGIモード化する時に「AddHandler」ディレクティブを使用してもPHPがうまく動かないことがある理由を解説します。

もくじ

  • なぜ「AddHandler」だと動かないのか?
  • 対処法…「SetHandler」+「FilesMatch」

なぜ「AddHandler」だと動かないのか?

私は、

  • OS:CentOS7
  • Apache2.4
  • PHP7
の環境でPHPをCGIモードにするべく、以下のような設定を行いました。 [VIM] ScriptAlias /php-hoge /var/www/cgi-bin/hoge-cgi/php-cgi SuexecUserGroup hoge hoge ServerName example.com ErrorLog /var/log/httpd/example.com_error_log CustomLog /var/log/httpd/example.com_access_log combined DocumentRoot “/home/hoge/public_html/piyo” AddHandler php-cgi .php Action php-cgi /php-hoge [/VIM]

/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 #中身を抜粋 #(中略) SetHandler application/x-httpd-php #(中略) [/VIM] 私がインストールしたPHP7では、拡張子が.phpのファイルをPHPとして処理するための設定に「SetHandler」が使われていたのです。

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 SuexecUserGroup hoge hoge ServerName example.com ErrorLog /var/log/httpd/example.com_error_log CustomLog /var/log/httpd/example.com_access_log combined DocumentRoot “/home/hoge/public_html/piyo” SetHandler php-cgi Action php-cgi /php-hoge [/VIM]

「FilesMatch」ディレクティブで拡張子が.phpのファイルだけを取り出し、それに対してSetHandlerディレクティブでPHPをCGIモードで動かす設定を施します。

参考リンク

このブログを応援する・寄付する

当ブログでは暗号通貨による寄付を募っております。

モナゲボタン モナゲボタン

Bitcoin:

Monacoin:

Litecoin: