Модуль mod_php и работа с домашними каталогами пользователей

Раздел: Конфигурация -> Модули 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
# В глобальной секции или в include

Mod 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 php
php8.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 в родительской конфигурации.

Модуль mod_php для home - comments

En
Mod php home (php)