У меня есть раздел конфигурации apache 2.4, который я использую для обработки редкой ситуации, когда неправильно настроенный ящик apache может обслуживать php-файлы как статический обычный текст и потенциально отказываться от учетных данных и т. д.
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<Files "*.php">
Require all denied
</Files>
</IfModule>
</IfModule>
Эти директивы проверяют наличие модуля php, и если он не находит ни один из них, он не будет обслуживать страницы.
Однако в текущей сборке httpd 2.4 для centos-8 php-fpm является методом настройки обработчика для php по умолчанию и не загружает никаких модулей для php:
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
# Enable http authorization headers
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
<FilesMatch \.(php|phar)$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</IfModule>
</IfModule>
К сожалению, модуль proxy_fcgi автоматически загружается httpd, поэтому он бесполезен в качестве индикатора того, настроен ли php-fpm (или нет):
[root@web httpd]# rpm -q --whatprovides /usr/lib64/httpd/modules/mod_proxy_fcgi.so
httpd-2.4.37-39.module_el8.4.0+778+c970deab.x86_64
Согласно с документ Существует ХАНДЛЕР
переменная:
HANDLER Имя обработчика, создающего ответ
... который должен вернуть один из во встроенных обработчиках
default-handler: отправьте файл с помощью default_handler(), который является обработчиком, используемым по умолчанию для обработки статического содержимого. (основной)
отправить как есть: отправить файл с заголовками HTTP как есть. (mod_asis)
cgi-script: обрабатывать файл как сценарий CGI. (mod_cgi)
imap-file: анализировать как файл правил карты изображений. (mod_imagemap)
server-info: получить информацию о конфигурации сервера. (мод_информация)
server-status: получить отчет о состоянии сервера. (мод_статус)
type-map: анализировать как файл карты типов для согласования содержимого. (мод_переговоры)
Однако мои попытки сопоставления с ним не увенчались успехом, например. Это не работает:
<FilesMatch \.(php|phar)$>
<If "%{HANDLER} == 'default-handler'">
Require all denied
</If>
</FilesMatch>
Любые предложения приветствуются.
Редактировать
Я сбросил значение переменной %{HANDLER} с обоими установленными php-fpm, а не так:
<IfModule headers_module>
Header always set X-HANDLER "expr=%{HANDLER}"
</IfModule>
и он вернул следующие заголовки:
X-HANDLER: text/plain # нет php-fpm
X-HANDLER: proxy:unix:/run/php-fpm/www.sock|fcgi://localhost # с php-fpm
поэтому я обновил тест до этого:
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<If "%{HANDLER} == 'text/plain'">
<Files "*.php">
Require all denied
</Files>
</If>
</IfModule>
</IfModule>
Однако и это не работает