我有一个 apache 2.4 配置部分,我用它来处理罕见的情况,即配置错误的 apache 框可能会将 php 文件作为静态纯文本提供,并可能放弃凭据等。
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<Files "*.php">
Require all denied
</Files>
</IfModule>
</IfModule>
这些指令检查 php 模块是否存在,如果找不到,则不会提供页面。
但是在 centos-8 的 httpd 2.4 当前版本中,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
变量:
HANDLER 创建响应的处理程序的名称
...应该返回内置处理程序
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)
但是,我尝试匹配它但没有成功,例如这不起作用:
<FilesMatch \.(php|phar)$>
<If "%{HANDLER} == 'default-handler'">
Require all denied
</If>
</FilesMatch>
欢迎提出任何建议。
编辑
我在安装了 php-fpm 的情况下转储了变量 %{HANDLER} 的值,但不是这样的:
<IfModule headers_module>
Header always set X-HANDLER "expr=%{HANDLER}"
</IfModule>
并返回以下标头:
X-HANDLER: text/plain # no php-fpm
X-HANDLER: proxy:unix:/run/php-fpm/www.sock|fcgi://localhost # with php-fpm
所以我将测试更新为:
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<If "%{HANDLER} == 'text/plain'">
<Files "*.php">
Require all denied
</Files>
</If>
</IfModule>
</IfModule>
然而,这也不起作用