PHP скрипты не выполняются - настройка веб сервера
Основное и самое эффективное решение
Как настроить веб сервер, чтобы PHP файлы выполнялись?
Наиболее частая причина скачивания PHP файлов - отсутствие обработчика для расширения .php в конфигурации веб сервера. Для Apache необходимо добавить директиву AddHandler или SetHandler. Для Nginx - настроить fastcgi_pass. Ниже приведены примеры для популярных серверов.
# Apache (mod_php)
AddHandler application/x-httpd-php .phpфайлы php скачиваются (проблема: php-файлы скачиваются вместо выполнения)
# Nginx + PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}не могу записать файл restore php (проблема с записью файла restore.php)
Проверить результат можно, создав файл test.php с содержимым <?php phpinfo(); ?>. Если после настройки появляется ошибка 500, проверьте пути к модулям и права на файлы.
Типичные ошибки:
- Ошибка 500 - часто из-за неверного пути к модулю или отсутствия самого модуля. Для Apache проверьте наличие LoadModule php_module.
- Файл .php отдается как текст - если сервер все равно не исполняет, возможно, директива не попала в конфигурацию (например, .htaccess не разрешен).
Проверка установки модуля PHP в Apache
Перед настройкой убедитесь, что сам модуль PHP установлен и загружен. Выполните команду:
apache2ctl -M | grep phpне работает php файл (не работает php-файл (ошибка выполнения))
Если вывод пустой, установите PHP и модуль:
sudo apt install php libapache2-mod-phpВозможные проблемы:
После установки может потребоваться перезапуск Apache (systemctl restart apache2).
Настройка через .htaccess при отсутствии доступа к основному конфигу
Если у вас нет прав на редактирование конфигурации сервера, можно использовать файл .htaccess в корневой директории сайта. Добавьте строку:
AddType application/x-httpd-php .phpУбедитесь, что в основном конфиге разрешена директива AllowOverride All для данной директории.
Проблема:
.htaccess может игнорироваться, если AllowOverride установлен в None или FileInfo не разрешен. Проверьте настройки виртуального хоста.
Настройка Apache с PHP-FPM (модный способ)
При использовании PHP-FPM вместо mod_php, необходимо настроить проксирование запросов к PHP-FPM через mod_proxy_fcgi. Пример директивы в виртуальном хосте:
<FilesMatch \.php$>
SetHandler 'proxy:fcgi://127.0.0.1:9000'
</FilesMatch>Или через ProxyPassMatch:
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1Типичные ошибки:
- Ошибка 502 Bad Gateway - PHP-FPM не запущен или не слушает на указанном адресе/сокете. Проверьте статус: systemctl status php7.4-fpm.
- Путь к файлу не соответствует реальному - проверьте директиву DocumentRoot.
Настройка Nginx с PHP-FPM
В конфигурации сервера Nginx для обработки PHP файлов необходимо определить location блок:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}Или с TCP соединением:
fastcgi_pass 127.0.0.1:9000;Ошибки:
Если Nginx возвращает 404, проверьте, что корневой путь указан верно. Часто проблема в отсутствии директивы `try_files` в location.
Настройка IIS для выполнения PHP
В Windows IIS необходимо добавить обработчик для .php файлов через менеджер IIS или через web.config:
<configuration>
<system.webServer>
<handlers>
<add name='PHP' path='*.php' verb='*' modules='FastCgiModule' scriptProcessor='C:\PHP\php-cgi.exe' resourceType='File' />
</handlers>
</system.webServer>
</configuration>Проблемы:
Убедитесь, что установлен PHP для Windows и путь к php-cgi.exe указан верно. Также может потребоваться установка FastCGI модуля.
Проверка Content-Type в скрипте PHP
Иногда причина в том, что сам скрипт не передает правильный заголовок Content-Type. Например, если скрипт выводит текст без header, браузер может посчитать его как скачиваемый файл. Всегда рекомендуется в начале скрипта указывать:
<?php
header('Content-Type: text/html; charset=utf-8');
?>Важно:
Это не решит проблему, если сервер не обрабатывает PHP вообще. Проверка заголовков через curl поможет диагностировать:
curl -I http://example.com/test.phpЕсли в ответе Content-Type: application/octet-stream или отсутствует, сервер не исполняет PHP.
Проверка расширения файла и пути
Убедитесь, что файл действительно имеет расширение .php, а не .php.txt или .php.bak. Некоторые серверы могут быть настроены только на конкретные расширения. Также проверьте, что файл находится в DocumentRoot.
Расширенные примеры настройки и диагностики
Ниже приведены подробные конфигурационные файлы и команды для различных серверов.
Пример полной конфигурации виртуального хоста Apache с mod_php
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Обработчик PHP
AddHandler application/x-httpd-php .php
# Дополнительно: директива для включения PHP
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
</VirtualHost>Пример конфигурации Nginx с PHP-FPM (полный блок server)
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}Проверка HTTP заголовков с помощью curl
curl -I http://localhost/test.phpHTTP/1.1 200 OK Date: ... Content-Type: text/html; charset=UTF-8 ...
Если Content-Type application/octet-stream или не указан, значит PHP не обрабатывается.
Создание информационного PHP скрипта
<?php
phpinfo();
?>Результат (часть вывода):
PHP Version 7.4.33 Loaded Configuration File => /etc/php/7.4/cli/php.ini ...
Команда для проверки загруженного модуля PHP в Apache
apachectl -M 2>/dev/null | grep phpphp7_module (shared)
Команда для проверки версии PHP CLI
php -vPHP 8.1.2 (cli) (built: ...) Copyright (c) The PHP Group Zend Engine v4.1.2, Copyright (c) Zend Technologies
Пример конфигурации PHP-FPM пула (www.conf)
[www]
user = www-data
group = www-data
listen = /run/php/php7.4-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3Проверка активных процессов PHP-FPM
ps aux | grep php-fpmwww-data ... /usr/sbin/php-fpm7.4 ...
Если php-fpm не запущен, запустите службу:
sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpmПример отладки через лог ошибок Apache
tail -f /var/log/apache2/error.logТипичная запись при ошибке с PHP-FPM:
[proxy_fcgi:error] AH01071: Got error 'Primary script unknown'
Использование консольной утилиты php для проверки синтаксиса скрипта
php -l test.phpNo syntax errors detected in test.php
Пример исправления с помощью .user.ini (для CGI/FastCGI)
; .user.ini файл в корне сайта
; Не гарантирует выполнение, но может влиять на настройки
; Убедитесь, что сервер использует CGI/FastCGI
; Добавить обработчик нельзя, но можно установить error_reporting