Apache Linux

Apache: PHP-файл скачивается или показывается как текст

  • Обновлено
  • Чтение ≈ 5 минут
  • Нужны права администратора

Краткий ответ

Если Apache отдаёт PHP-файл как текст или предлагает его скачать, не подключён модуль PHP или обработчик php-fpm. Включите модуль, добавьте SetHandler или AddType, проверьте теги <?php, перезапустите Apache и очистите кэш браузера.

В этой статье
  1. Что происходит
  2. Причины
  3. Порядок
  4. Проверка после исправления
  5. Особенности разных систем
Apache serves PHP source code
<?php echo "Hello"; ?> отображается в браузере как текст
По-русскиБраузер скачивает .php вместо выполнения.

#Что происходит

Если вместо результата работы скрипта в браузере виден исходный код <?php ... ?> или предлагается скачать файл, веб-сервер не передаёт .php интерпретатору. Причины: не установлен или не включён модуль PHP (libapache2-mod-php) либо не настроена связка с php-fpm, отсутствует обработчик для расширения .php, в файле использованы короткие теги <?, файл открыт по протоколу file:// вместо http://, или сервер не перезапущен после установки. Ошибка опасна: исходный код может раскрыть пароли от базы.

#Причины

Возможная причинаКак узнатьЧто делать
Не включён модуль PHPНе установлен.Исходный код в браузере.a2enmod php, перезапуск.
Нет SetHandler для php-fpmНе настроен.Файл скачивается.Добавьте обработчик.
Конфликт MPMevent с mod_php.Модуль не загружается.Используйте prefork или php-fpm.
Короткие теги<? вместо <?php.Исходный код.Используйте <?php.
Открыт через file://Локальный файл.URL начинается с file.Откройте через http.
Кэш браузераСтарый ответ.Исправили, но результат тот же.Ctrl+F5, инкогнито.

#Порядок

  1. Убедитесь, что адрес начинается с http://localhost/ или вашего домена, аВ браузере откройте страницу через https://ваш-домен/файл.php или адрес локального сервера http://localhost/файл.php, а не двойным щелчком по файлу с file://. Если браузер предлагает скачать .php, немедленно прекратите публичное тестирование: сервер может раскрывать исходный код и пароли. Временно ограничьте доступ к проблемному сайту до исправления обработчика PHP.
  2. Проверьте, что PHP установлен: php -vНа сервере по SSH выполните php -v, но учтите, что консольная версия PHP может не совпадать с обработчиком Apache. В панели хостинга откройте настройки конкретного сайта и проверьте, какой режим PHP назначен этому домену. Затем apachectl -M | grep -Ei "php|proxy_fcgi|mpm" поможет определить загруженные модули Apache; если обработчика нет, его нужно настроить по установленной архитектуре.
  3. Для mod_php включите модуль и MPM preforkАдминистратор: выберите один поддерживаемый способ обработки PHP — модуль Apache или PHP-FPM через proxy_fcgi — и следуйте документации вашего дистрибутива/панели. Не включайте одновременно mod_php с несовместимым MPM и другую обработку тех же запросов. При PHP-FPM сверьте реальный сокет пула с SetHandler в виртуальном хосте, сохраните конфиг и выполните apachectl configtest.
  4. Проверьте, что в файле используется полный тег <?phpВ редакторе исходного файла проверьте, что PHP-код начинается с <?php, а не с короткого тега <? при отключённом short_open_tag. Это относится только к синтаксису PHP: отсутствие полного тега не объясняет скачивание всего файла, если сервер вообще не настроен на исполнение PHP. После проверки не выводите чувствительные данные в публичный ответ.
  5. Убедитесь, что расширение файла .php, а не .php.txtВ файловом менеджере панели включите отображение полных имён и расширений. Проверьте, что файл действительно заканчивается на .php, а не .php.txt или .php.html. Убедитесь, что URL ведёт именно в каталог данного виртуального хоста. Переименовывайте файл только после проверки внутренних ссылок и резервной копии.
  6. Перезапустите Apache и проверьте конфигурациюПроверьте синтаксис конфигурации sudo apachectl configtest, затем перезагрузите настройки sudo systemctl reload apache2 либо httpd согласно дистрибутиву. Если PHP-FPM использует отдельную службу, убедитесь, что она запущена; не перезапускайте её без необходимости. При ошибке конфигурации ничего не применяйте, восстановите сохранённый файл.
  7. Очистите кэш браузера или откройте страницу в режиме инкогнитоПосле настройки проверьте новый безобидный тестовый PHP-файл без phpinfo() и секретов в изолированном закрытом каталоге, например с выводом фиксированной фразы. Убедитесь, что браузер показывает результат исполнения, а не текст <?php. Затем удалите тестовый файл и проверьте реальную страницу в приватном окне, чтобы исключить старую загруженную версию из кэша.
  8. Проверьте журнал ошибокПри сохранении проблемы сразу прочитайте Apache error.log и журнал службы PHP-FPM для нужного времени запроса. Проверьте SetHandler, состояние сокета и настройки данного виртуального хоста; не изменяйте сайты соседних доменов. Если исходный PHP уже был публично доступен, оцените возможную компрометацию секретов и смените раскрытые ключи после восстановления работы.
  9. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Ubuntu/Debian: установка PHP для Apache
    Linux · Терминал (Bash)Команда
    Ubuntu/Debian: установка PHP для Apache
    php -v
    apachectl -M | grep -Ei "php|proxy_fcgi|mpm"
    # Это только проверка. Подключать PHP-обработчик следует по документации
    # установленной ОС, Apache и фактической версии PHP сайта.
    Вариант 2Вариант с php-fpm (более современный): включить прокси и конфигурацию
    Linux · Терминал (Bash)Команда
    Вариант с php-fpm (более современный): включить прокси и конфигурацию
    apachectl -M | grep -E "proxy_fcgi|setenvif"
    # Для работы PHP-FPM проверьте фактический сокет и SetHandler конкретного сайта.
    # Не включайте php8.3-fpm на сервере, где используется другая версия.
    Вариант 3Обработчик PHP через php-fpm внутри VirtualHost
    ТекстКоманда
    Обработчик PHP через php-fpm внутри VirtualHost
    <FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
    </FilesMatch>
    Вариант 4Для mod_php на CentOS/Windows: подключение модуля и типов
    ТекстКоманда
    Для mod_php на CentOS/Windows: подключение модуля и типов
    LoadModule php_module modules/libphp.so
    AddType application/x-httpd-php .php
    DirectoryIndex index.php index.html
    Вариант 5Проверка конфигурации и активных модулей
    Linux · Терминал (Bash)КомандаНужен sudo
    Проверка конфигурации и активных модулей
    apache2ctl configtest
    apache2ctl -M | grep -iE "php|proxy_fcgi|mpm"
    sudo tail -n 30 /var/log/apache2/error.log
    Вариант 6Тестовый файл для проверки
    PHPКоманда
    Тестовый файл для проверки
    <?php
    echo "Обработчик PHP работает";

#Проверка после исправления

Откройте http://localhost/test.php: должна загрузиться таблица phpinfo(). Удалите тестовый файл после проверки. Если страница пустая, смотрите журнал: tail -f /var/log/apache2/error.log — там будет указана ошибка PHP.

#Особенности разных систем

В Windows с XAMPP или OpenServer PHP подключён уже при установке, поэтому исходный код в браузере почти всегда означает, что страницу открыли как файл с диска (file:///C:/...) либо положили файл не в папку htdocs или domains. В Docker-образе php:apache модуль включён по умолчанию, а проблемы возникают, когда смонтирован неверный каталог документов. На хостинге с панелью (ISPmanager, cPanel) версия PHP выбирается в настройках домена: если обработчик отключён или выбран «Нет PHP», файл будет отдаваться как текст.

Если на сервере несколько версий PHP, проверьте, что включена одна: команда apache2ctl -M | grep php покажет все подключённые модули. Две версии mod_php одновременно не работают, нужно отключить лишнюю: sudo a2dismod php7.4. Не забывайте, что после смены версии обычно требуется перезапуск, а не только перезагрузка конфигурации.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.