<?php echo "Hello"; ?> отображается в браузере как текст
#Что происходит
Если вместо результата работы скрипта в браузере виден исходный код <?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, инкогнито. |
#Порядок
- Убедитесь, что адрес начинается с http://localhost/ или вашего домена, аВ браузере откройте страницу через
https://ваш-домен/файл.phpили адрес локального сервераhttp://localhost/файл.php, а не двойным щелчком по файлу сfile://. Если браузер предлагает скачать.php, немедленно прекратите публичное тестирование: сервер может раскрывать исходный код и пароли. Временно ограничьте доступ к проблемному сайту до исправления обработчика PHP. - Проверьте, что PHP установлен: php -vНа сервере по SSH выполните
php -v, но учтите, что консольная версия PHP может не совпадать с обработчиком Apache. В панели хостинга откройте настройки конкретного сайта и проверьте, какой режим PHP назначен этому домену. Затемapachectl -M | grep -Ei "php|proxy_fcgi|mpm"поможет определить загруженные модули Apache; если обработчика нет, его нужно настроить по установленной архитектуре. - Для mod_php включите модуль и MPM preforkАдминистратор: выберите один поддерживаемый способ обработки PHP — модуль Apache или PHP-FPM через proxy_fcgi — и следуйте документации вашего дистрибутива/панели. Не включайте одновременно mod_php с несовместимым MPM и другую обработку тех же запросов. При PHP-FPM сверьте реальный сокет пула с
SetHandlerв виртуальном хосте, сохраните конфиг и выполнитеapachectl configtest. - Проверьте, что в файле используется полный тег <?phpВ редакторе исходного файла проверьте, что PHP-код начинается с
<?php, а не с короткого тега<?при отключённомshort_open_tag. Это относится только к синтаксису PHP: отсутствие полного тега не объясняет скачивание всего файла, если сервер вообще не настроен на исполнение PHP. После проверки не выводите чувствительные данные в публичный ответ. - Убедитесь, что расширение файла .php, а не .php.txtВ файловом менеджере панели включите отображение полных имён и расширений. Проверьте, что файл действительно заканчивается на
.php, а не.php.txtили.php.html. Убедитесь, что URL ведёт именно в каталог данного виртуального хоста. Переименовывайте файл только после проверки внутренних ссылок и резервной копии. - Перезапустите Apache и проверьте конфигурациюПроверьте синтаксис конфигурации
sudo apachectl configtest, затем перезагрузите настройкиsudo systemctl reload apache2либоhttpdсогласно дистрибутиву. Если PHP-FPM использует отдельную службу, убедитесь, что она запущена; не перезапускайте её без необходимости. При ошибке конфигурации ничего не применяйте, восстановите сохранённый файл. - Очистите кэш браузера или откройте страницу в режиме инкогнитоПосле настройки проверьте новый безобидный тестовый PHP-файл без
phpinfo()и секретов в изолированном закрытом каталоге, например с выводом фиксированной фразы. Убедитесь, что браузер показывает результат исполнения, а не текст<?php. Затем удалите тестовый файл и проверьте реальную страницу в приватном окне, чтобы исключить старую загруженную версию из кэша. - Проверьте журнал ошибокПри сохранении проблемы сразу прочитайте Apache error.log и журнал службы PHP-FPM для нужного времени запроса. Проверьте
SetHandler, состояние сокета и настройки данного виртуального хоста; не изменяйте сайты соседних доменов. Если исходный 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. Не забывайте, что после смены версии обычно требуется перезапуск, а не только перезагрузка конфигурации.