Apache Error AH01071: Primary script unknown — Решение для PHP-FPM
При переходе на страницы сайта браузер возвращает белый экран с текстовым сообщением File not found. или код 404 Not Found / 500 Internal Server Error. В error.log Apache регистрируется ошибка выполнения скрипта: [proxy_fcgi:error] [pid 1234:tid 5678] [client ...] AH01071: Got error 'Primary script unknown'.
| Компонент | Переданный параметр | Причина сбоя |
|---|---|---|
Apache DocumentRoot | /var/www/site/public | Apache передает путь в сокет PHP-FPM |
FastCGI SCRIPT_FILENAME | /var/www/site/index.php | PHP-FPM не находит файл по переданному пути |
| Права файловой системы | Пользователь www-data / apache | У процесса PHP-FPM нет прав на чтение файла скрипта |
- Статические ресурсы (CSS, JS, PNG) загружаются веб-сервером корректно.
- Любой PHP-скрипт не исполняется и возвращает мгновенный отказ «Primary script unknown».
- Проверьте директиву
DocumentRootв конфигурационном файле виртуального хоста. Путь должен точно указывать на директорию с вашимindex.php(например,public/для Laravel/Symfony):<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/example.com/public <Directory /var/www/example.com/public> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> # Корректная связка с PHP-FPM через SetHandler: <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost" </FilesMatch> </VirtualHost> - Если используется конструкция
ProxyPassMatch, замените ее на рекомендуемыйSetHandlerили исправьте регулярное выражение путей:# УСТАРЕВШИЙ И ОШИБОЧНЫЙ ВАРИАНТ (ЧАСТО ЛОМАЕТ ПУТИ): # ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php8.2-fpm.sock|fcgi://localhost/var/www/html/$1 # СОВРЕМЕННЫЙ ПРАВИЛЬНЫЙ ВАРИАНТ: <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost" </FilesMatch> - Проверьте физическое существование файла на диске и права доступа:
ls -la /var/www/example.com/public/index.php sudo chown -R www-data:www-data /var/www/example.com/public sudo chmod -R 755 /var/www/example.com/public - Для Docker окружений: Убедитесь, что директория с исходным кодом примонтирована в абсолютно одинаковый путь как внутри контейнера Apache, так и внутри контейнера PHP-FPM.
- Перезапустите стек:
sudo systemctl reload apache2 && sudo systemctl restart php8.2-fpm.
ProxyPassMatch ^/(.*\.php)$ для передачи запросов в PHP-FPM. Она уязвима к ошибкам трансляции URL в пути файловой системы и создает известные проблемы безопасности. Используйте директиву SetHandler "proxy:fcgi://..." внутри блока <FilesMatch>.Частые вопросы (FAQ)
Кто именно генерирует текст 'Primary script unknown'?
Это сообщение генерирует непосредственно движок PHP-FPM, когда полученный через FastCGI параметр SCRIPT_FILENAME указывает на путь, который не существует в файловой системе PHP-FPM.
Почему статика работает, а PHP нет?
Apache отдает статические файлы напрямую со своего диска силами модуля core, а обработку PHP делегирует отдельному демону PHP-FPM, передавая ему текстовый путь к файлу.
Может ли директива open_basedir вызывать ошибку AH01071?
Да, если запрошенный файл находится за пределами директорий, разрешенных директивой open_basedir в php.ini, PHP-FPM заблокирует его выполнение с ошибкой Primary script unknown.
Как проверить, какой именно путь Apache передает в PHP-FPM?
Включите LogLevel proxy_fcgi:trace7 в блоке VirtualHost, и Apache запишет все передаваемые FastCGI параметры в error.log.