Apaceにてphpのコードが出力されたりダウンロードされたりする
概要と環境
- RaspberryPi 3B+ (RaspbianOS)
- Apache2 と php (v7.3) は導入されている
.php
をサーバー上で動かすと、むき出しのソースコードが表示されたり、phpファイルがダウンロードされたりする- 原因を色々調べた時の知見を記しています
(自環境における)原因と突破口
単純に php ソース 表示される
とか Apache php ダウンロードされる
とかで調べると
AddType application/x-httpd-php .php
とか
LoadModule php7_module "/[なんちゃらかんちゃら]/modules/libphp7.so"
とか記載しておくといいぜ!
...みたいな解決策が多く目に入ったのですが、 自分のケースは、完全にそれ以前の問題 であったようです。
結論から言えば、「Apache2 で使うモジュールに、php用の物が組み込まれていなかった」 ことが大きな原因であり、
sudo apt install libapache2-mod-php
が、本ケースの問題解決・大きな突破口となりました
自分用コマンドメモ
apachectl -M
Apache2で読み込むモジュール一覧確認
ls /usr/lib/apache2/modules/
同上
ls /etc/apache2/mods-enabled
同上(有効中)
vim /etc/apache2/apache2.conf
Apache設定ファイル
vim /etc/php/7.3/apache2/php.ini
Apacheを対象とした、PHP側の設定ファイル
確認した項目など
Apacheにphp用モジュールがロードされているか疑う
-
apachectl -M
の実行ログ(
apachetl -M | grep php
とかで抽出すれば分かりやすいかも )
Loaded Modules:
core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
log_config_module (static)
logio_module (static)
version_module (static)
unixd_module (static)
access_compat_module (shared)
alias_module (shared)
auth_basic_module (shared)
authn_core_module (shared)
authn_file_module (shared)
authz_core_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
filter_module (shared)
mime_module (shared)
mpm_event_module (shared)
negotiation_module (shared)
reqtimeout_module (shared)
setenvif_module (shared)
status_module (shared)
一覧に php っぽいモジュールの記載が無かった。
Apacheでphpを使わせるためのモジュールis何処?
/usr/lib/apache2/modules/
の中に、 ~.so
で終わるファイルが わさんさかあって、これかなーと思ったんだけど
php っぽい名前の物が1つもなかった。
有効化するだけでOKだったりしないかな?
ググった情報をもとに、モジュールの有効コマンドである
sudo a2enmod php7
したら
ERROR: Module php7 does not exist!
の応答...(゚ω゚)
「(一覧に)存在してなければ、有効のしようが無いです」 ← ド正論
突破口
これや!!!
libapache2-mod-php
ってのを突っ込む
https://packages.debian.org/ja/sid/libapache2-mod-php
sudo apt install libapache2-mod-php
の実行ログ
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libapache2-mod-php7.3
Suggested packages:
php-pear
The following NEW packages will be installed:
libapache2-mod-php libapache2-mod-php7.3
0 upgraded, 2 newly installed, 0 to remove and 7 not upgraded.
Need to get 1,089 kB of archives.
After this operation, 3,500 kB of additional disk space will be used.
Do you want to continue? [Y/n]
あとは Y 押しときゃ進む
ls /etc/apache2/mods-enabled | grep php
で、
apache2 が読み込むモジュールに php を含むそれっぽい名前の物があるか再び確認
php7.3.conf
php7.3.load
の応答...
「勝ったな」「ああ」
インストール後、以下を再び確認
ls /usr/lib/apache2/modules/ | grep php
libphp7.3.so
apachectl -M | grep php
php7_module (shared)
それぞれこのような応答結果になった。
インストール前はどちらも無かったので、これはイイ感じに事が運んでいますね
動いた
sudo service apache2 reload
で設定を再読み込み
sudo service apache2 restarc
心配ならApache再起動
試しに sudo vim /var/www/html/index.php
とかで動作確認用の.phpファイルなんぞ作成。
<?php
phpinfo();
あとはブラウザからアクセスして phpinfo が表示されれば成功👍
必要かと思ったけどそうではなかった工程
Qiita- Apacheのhttpd.confにPHPを設定する方法 を参考に、
Include /usr/local/etc/httpd/extra/php73.conf
とか
AddType application/x-httpd-php .php
LoadModule php7_module "/usr/local/Cellar/php/7.3.1/lib/httpd/modules/libphp7.so"
<IfModule dir_module>
DirectoryIndex index.php
</IfModule>
PHPIniDir "/usr/local/etc/php/7.3/php.ini"
とか、こんな感じの設定を(自環境様に改造して)記載するものかと思っていたけど、自環境では追記しなくても動作した。
既に記載済み?
どうやら先程インストールした libapache2-mod-php
の影響か、
生成された /etc/apache2/mods-available/php7.3.conf
に以下が記載されており、
自前でphpを動作させる様な記述をせずとも済んでいた模様。
/etc/apache2/mods-available/php7.3.conf
の中身<FilesMatch ".+\.ph(ar|p|tml)$"> SetHandler application/x-httpd-php </FilesMatch> <FilesMatch ".+\.phps$"> SetHandler application/x-httpd-php-source # Deny access to raw php sources by default # To re-enable it's recommended to enable access to the files # only in specific virtual host or directory Require all denied </FilesMatch> # Deny access to files without filename (e.g. '.php') <FilesMatch "^\.ph(ar|p|ps|tml)$"> Require all denied </FilesMatch> # # Running PHP scripts in user directories is disabled by default # # To re-enable PHP in user directories comment the following lines # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it # prevents .htaccess files from disabling it. <IfModule mod_userdir.c> <Directory /home/*/public_html> php_admin_flag engine Off </Directory> </IfModule>
これと同様、/etc/apache2/mods-available/php7.3.load
には以下が記載
/etc/apache2/mods-available/php7.3.load
の中身# Conflicts: php5 # Depends: mpm_prefork LoadModule php7_module /usr/lib/apache2/modules/libphp7.3.so
application/x-httpd-php だの LoadModule だの、
色々調べていた時に見かけた「phpが正常に実行されない?これ記載しときなよ!」という諸々のアドバイスと見事なまでに合致した内容ですね...w
( まぁ自分の場合、記載したところで参照先がそもそも存在していなかったという躓きが先にあった訳なんですが )
こういう流れっぽい
/usr/lib/apache2/modules/libphp7.3.so
が存在する/etc/apache2/mods-available/php7.3.load
に、1. を参照する内容が記載されている/etc/apache2/mods-available/php7.3.conf
に、Apacheでphpを動作させる設定が記載されている
中身はSetHandler application/x-httpd-php
とかFilesMatch
に関するものとか- ↑ この2. と 3. はある意味セットであり、特に 2. はApache にとってモジュール読み出し用設定ファイル(?)の扱いである
a2enmod
系を扱えば個々のモジュールを有効、逆にa2dismod
なら無効にできる
( 多分有効になってる )- 前述 3. のファイルに、
.php
ファイルにアクセスされたときの挙動やらアクセス制限とかの基本的な設定が記載されていた。
モジュールが正常に導入・動作していても、ここの記述がしっかりしていないと 冒頭の「phpファイルが実行されず、ブラウザ上でソースがまんま表示されてしまう」という状況になるのだと思う
足掛かり・参考となったリンク
Qiita - apache2+phpでソースが表示される
teratail - PHPのソースコードがそのまま表示されてしまう
りなっくすとらずぱい! - Raspberry PiにPHPをインストールする