
Tengo una sección de configuración de Apache 2.4 que utilizo para manejar la rara situación en la que un cuadro de Apache mal configurado podría servir archivos php como texto plano estático y potencialmente renunciar a credenciales, etc.
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<Files "*.php">
Require all denied
</Files>
</IfModule>
</IfModule>
Esas directivas verifican si el módulo php está presente y, si no encuentra ninguno de ellos, no servirá las páginas.
Sin embargo, en la versión actual de httpd 2.4 para centos-8, php-fpm es el método predeterminado para configurar un controlador para php y no carga ningún módulo para 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>
Desafortunadamente, httpd carga automáticamente el módulo proxy_fcgi, por lo que no es útil como indicación de si php-fpm está configurado (o no):
[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
De acuerdo aEl documentohay una HANDLER
variable:
HANDLER El nombre del controlador que crea la respuesta.
... que debería devolver uno de losen manipuladores integrados
default-handler: Send the file using the default_handler(), which is the handler used by default to handle static content. (core) send-as-is: Send file with HTTP headers as is. (mod_asis) cgi-script: Treat the file as a CGI script. (mod_cgi) imap-file: Parse as an imagemap rule file. (mod_imagemap) server-info: Get the server's configuration information. (mod_info) server-status: Get the server's status report. (mod_status) type-map: Parse as a type map file for content negotiation. (mod_negotiation)
Sin embargo, mis intentos de compararlo no tienen éxito; por ejemplo, esto no funciona:
<FilesMatch \.(php|phar)$>
<If "%{HANDLER} == 'default-handler'">
Require all denied
</If>
</FilesMatch>
Se agradece cualquier sugerencia.
Editar
Descarté el valor de la variable %{HANDLER} con ambos php-fpm instalados, y no así:
<IfModule headers_module>
Header always set X-HANDLER "expr=%{HANDLER}"
</IfModule>
y devolvió los siguientes encabezados:
X-HANDLER: text/plain # no php-fpm
X-HANDLER: proxy:unix:/run/php-fpm/www.sock|fcgi://localhost # with php-fpm
así que actualicé la prueba a esto:
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<If "%{HANDLER} == 'text/plain'">
<Files "*.php">
Require all denied
</Files>
</If>
</IfModule>
</IfModule>
Sin embargo, eso tampoco funciona.