Модуль mod_php и работа с домашними каталогами пользователей
Настройка mod_php для домашних каталогов пользователей
Как настроить mod_php для выполнения PHP в домашней директории через глобальную конфигурацию Apache?
Основной подход:
Добавление директивы AddHandler application/x-httpd-php .php в секцию <Directory /home/*/public_html> позволяет обрабатывать PHP файлы в домашних папках всех пользователей. Это решение подходит для серверов, где требуется единообразная обработка PHP для всех пользователей при использовании модуля mod_php.
# Файл /etc/apache2/apache2.conf или в конфигурации use
# В глобальной секции или в includeMod php home (модуль mod_php для home)
<Directory /home/*/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
AddHandler application/x-httpd-php .php
</Directory>Mod php v (версия mod_php)
После добавления необходимо перезапустить Apache:
sudo systemctl restart apache2Типичные проблемы:
- Ошибка 403 Forbidden - рекомендуется проверить права на домашнюю директорию и наличие
Require all granted. - PHP не выполняется - следует убедиться, что mod_php включён (команда
sudo a2enmod php8.x). - Конфликт с другими обработчиками - если используется PHP-FPM, может возникнуть неоднозначность. В таком случае следует отключить mod_php для этой директории.
Как включить PHP в домашнем каталоге через .htaccess?
Если глобальная конфигурация не позволяет изменять, можно использовать файл .htaccess в корне домашнего каталога пользователя. Для этого в глобальной конфигурации должно быть установлено AllowOverride All (или хотя бы AllowOverride Options и AllowOverride FileInfo).
# Внутри /home/user/public_html/.htaccess
AddHandler application/x-httpd-php .phpТакже можно использовать SetHandler:
SetHandler application/x-httpd-phpВозможные ошибки:
- Если .htaccess игнорируется - проверить
AllowOverrideв родительской конфигурации. - Ошибка 500 при использовании
SetHandlerбез указания файлов - убедиться, что директива применяется только к нужным файлам.
Как использовать модуль mod_userdir для PHP?
Модуль mod_userdir автоматически создаёт адреса вида http://server/~user. Для включения PHP в таких директориях достаточно активировать mod_userdir и добавить обработчик PHP в конфигурацию для директории пользователя.
# Включить mod_userdir
sudo a2enmod userdir
sudo systemctl restart apache2# В конфигурации Apache (например, /etc/apache2/mods-enabled/userdir.conf)
<Directory /home/*/public_html>
PHPIniDir /home/*/public_html
AddHandler application/x-httpd-php .php
Require all granted
</Directory>Проблемы:
- Скрипты выполняются от пользователя www-data - это может нарушить права на файлы. Для повышения безопасности рекомендуется использовать suPHP или PHP-FPM.
- Директива
PHPIniDirможет не поддерживаться в некоторых версиях Apache.
Как отключить mod_php для домашних каталогов по соображениям безопасности?
В некоторых конфигурациях лучше запретить выполнение PHP в пользовательских директориях, особенно если используется mod_php от владельца процесса Apache. Для этого в глобальной конфигурации достаточно не указывать обработчик PHP для /home/* или явно удалить его:
<Directory /home/*/public_html>
RemoveHandler .php
</Directory>Этот способ используется, когда код пользователя не заслуживает доверия, а PHP выполняется через FastCGI или прокси.
Типичная ситуация:
После отключения пользователи не смогут выполнять PHP через mod_php, но если используется альтернативный метод (например, PHP-FPM), скрипты продолжат работать.
Расширенные примеры настройки mod_php для home
Пример 1: Проверка активного модуля mod_php
# Проверить, какие модули PHP загружены
sudo apachectl -M | grep phpphp8.1_module (shared) # Пример вывода, если модуль включён
Если модуль не отображается, его следует включить:
sudo a2enmod php8.1 # замените версию на вашу
sudo systemctl restart apache2Пример 2: Тестовый PHP скрипт в домашнем каталоге
# Файл /home/user/public_html/info.php со следующим содержимым
<?php phpinfo(); ?>Доступ к скрипту осуществляется по URL вида http://server/~user/info.php или http://server/user/info.php (зависит от конфигурации).
Отобразится полная информация о конфигурации PHP, включая загруженные модули и настройки.
Пример 3: Настройка через .htaccess с разными расширениями
# .htaccess в /home/user/public_html/
AddHandler application/x-httpd-php .php .phtml .php3Также можно задать директиву PHPIniDir для указания отдельного php.ini:
PHPIniDir /home/user/public_htmlПример 4: Ограничение PHP только для одного пользователя
<Directory /home/trusteduser/public_html>
AddHandler application/x-httpd-php .php
</Directory>
<Directory /home/*/public_html>
RemoveHandler .php
</Directory>Данный способ позволяет дать PHP одному пользователю, а остальным нет.
Пример 5: Использование mod_php с настройками php.ini через .htaccess
# В .htaccess
php_value upload_max_filesize 64M
php_value post_max_size 32MЭтот метод применим, если mod_php настроен на обработку директив через .htaccess с учётом AllowOverride Options.
Ошибка при использовании php_value в .htaccess:
Если появляется ошибка 500, значит директива не разрешена. Следует включить AllowOverride с опцией Options или All в родительской конфигурации.