Исправление ошибки AH01071: Got error 'Primary script unknown' HESTIACP v.1.8.12
Пишу гайд, т.к сам долго разбирался с ошибкой File not found, при работе с доменом типа: мойсайт.рф, либо другой сайт использующий специальные символы
Информация взята из этого источника
Мы можем рассмотреть на данный момент(10.11.2024) два способа исправления этой ошибки.
Начнем с первого способа
Проблема: При использовании Apache с PHP-FPM через модуль mod_proxy_fcgi
может возникнуть проблема некорректной передачи параметров $_GET
в PHP-скрипты. Это связано с тем, что Apache повторно кодирует URL, что приводит к неправильной обработке параметров.
Решение: Заменить директиву <FilesMatch>
с SetHandler
на ProxyPassMatch
с опцией nocanon
. Это позволит корректно передавать параметры запросов в PHP без повторного URL-кодирования.
Шаги по исправлению
Откройте файл конфигурации Apache для вашего виртуального хоста.
Обычно он находится по пути:
/home/USERNAME/conf/web/DOMAIN/apache2.conf
Пример:
/home/testhoster1/conf/web/idn-tést.eu/apache2.conf
Найдите и удалите или закомментируйте следующие строки:
<FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.2-fpm-idn-tést.eu.sock|fcgi://localhost" </FilesMatch>
Добавьте следующую строку вместо удаленных:
ProxyPassMatch ^/(.*\.php)(?:$|\?) "unix:/run/php/php8.2-fpm-idn-tést.eu.sock|fcgi://localhost/home/testhoster1/web/idn-tést.eu/public_html/$1" nocanon
Объяснение параметров:
^/(.*\.php)(?:$|\?)
— регулярное выражение, соответствующее всем запросам к файлам.php
, включая параметры."unix:/run/php/php8.2-fpm-idn-tést.eu.sock|fcgi://localhost/..."
— указывает путь к сокету PHP-FPM и корневой директории сайта.nocanon
— предотвращает повторное URL-кодирование запроса Apache.
Сохраните изменения в файле конфигурации.
Перезапустите Apache для применения изменений:
sudo systemctl restart apache2
Пример изменений (diff)
<VirtualHost *:80>
ServerName idn-tést.eu
DocumentRoot /home/testhoster1/web/idn-tést.eu/public_html
<Directory /home/testhoster1/web/idn-tést.eu/public_html>
AllowOverride All
Options +Includes -Indexes +ExecCGI
</Directory>
- # <FilesMatch \.php$>
- # SetHandler "proxy:unix:/run/php/php8.2-fpm-idn-tést.eu.sock|fcgi://localhost"
- # </FilesMatch>
+ # Используем ProxyPassMatch с опцией nocanon для предотвращения повторного URL-кодирования
+ ProxyPassMatch ^/(.*\.php)(?:$|\?) "unix:/run/php/php8.2-fpm-idn-tést.eu.sock|fcgi://localhost/home/testhoster1/web/idn-tést.eu/public_html/$1" nocanon
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
IncludeOptional /home/testhoster1/conf/web/idn-tést.eu/apache2.conf_*
IncludeOptional /etc/apache2/conf.d/*.inc
</VirtualHost>
Объяснение
Почему
ProxyPassMatch
? Эта директива позволяет более точно контролировать сопоставление запросов и передачу их на backend (PHP-FPM), включая параметры запроса.Роль
nocanon
: Предотвращает повторное URL-кодирование Apache, что сохраняет исходные параметры$_GET
без искажений.
Заключение
После внесения этих изменений и перезапуска Apache проблема с передачей параметров $_GET
должна быть устранена. Теперь PHP-скрипты будут правильно получать и обрабатывать параметры запросов.
Использование готового скрипта исправления
Долго инструкцию расписывать не буду, используем следующий скрипт
https://github.com/hestiacp/hestiacp/blob/8d5bd57c8fc5756a8664d15f9a69478df413b45c/install/upgrade/versions/1.9.0_extras/migrate_SetHandler_to_ProxySetMatch.php
Данный скрипт необходимо запускать каждый раз после добавления домена.
Я забыл сказать, что патч не изменяет настройки в файле apache2.ssl.conf
. Из-за этого домен без SSL работает нормально, но с SSL всё ещё выдаёт "File not found".
Пока что я вышел из ситуации, сделав копию патча и изменив в нём переменную $conf_files
, заменив строку на apache2.ssl.conf
.
Второй способ
Устанавливаем заранее заготовленную панель хостером (скорее всего она версии 1.8.11)

Переходим в меню "CRON"

И замораживаем процесс до выхода обновления 1.9.0
Надеюсь данная статья будет полезна, благодарю за внимание.
Корректировки и правки в комментариях приветствуются ;)