
本文介绍在现代 Apache(尤其是 CentOS 8/9 + httpd + php 模块化安装)中,PHP 不再依赖传统 AddHandler 指令,而是通过 SetHandler + FilesMatch 实现 MIME 类型绑定;并详解如何全局启用 PHP 解析,同时禁止指定目录(如 dont_interpret_php)执行 PHP。
本文介绍在现代 apache(尤其是 centos 8/9 + httpd + php 模块化安装)中,php 不再依赖传统 `addhandler` 指令,而是通过 `sethandler` + `filesmatch` 实现 mime 类型绑定;并详解如何全局启用 php 解析,同时禁止指定目录(如 `dont_interpret_php`)执行 php。
在较新版本的 Apache(2.4.17+)与模块化 PHP(如 php-fpm 或 libphp.so)集成方案中,官方已弃用 AddHandler php-script .php 这类静态绑定方式,转而采用更灵活、更安全的 SetHandler 结合
你观察到的 /etc/httpd/conf.modules.d/20-php.conf 中仅包含 LoadModule php_module modules/libphp.so,正是这一演进的体现——模块加载后,实际的文件类型映射由独立的配置片段完成,通常位于 /etc/httpd/conf.d/ 或 /etc/httpd/conf.modules.d/ 下的其他 .conf 文件中。
✅ 首先,定位 PHP 处理器绑定规则:
运行以下命令搜索所有含 php 的配置片段:
grep -R "SetHandler.*x-httpd-php\|<FilesMatch.*php" /etc/httpd/
常见输出类似:
<FilesMatch "\.ph(p[34578]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>该配置等效于旧版的 AddHandler php-script .php,但语义更明确:匹配 .php、.phar、.phtml 等扩展名的文件,统一交由 application/x-httpd-php 处理器执行。
立即学习“PHP免费学习笔记(深入)”;
✅ 全局启用 PHP(默认已满足):
只要上述
✅ 禁用特定目录的 PHP 解析(关键需求):
要在 dont_interpret_php 目录下强制以纯文本方式提供 .php 文件(不解析、不执行),需在对应
<Directory "/var/www/html/dont_interpret_php">
# 禁用 PHP 处理器
<FilesMatch "\.php$">
SetHandler None
</FilesMatch>
# 可选:显式设置为纯文本响应(增强安全性)
AddType text/plain .php
# 可选:禁止执行任何脚本(防御性配置)
Require all granted
php_flag engine off
</Directory>⚠️ 注意事项:
- SetHandler None 是核心指令,它显式解除当前上下文中对 .php 文件的处理器绑定;
- php_flag engine off 仅对 mod_php(嵌入式)有效;若使用 php-fpm,此行可省略,SetHandler None 已足够;
- AddType text/plain .php 确保浏览器不会尝试执行,而是下载或显示源码(符合“as is”要求);
- 修改后务必验证配置并重启服务:
sudo httpd -t && sudo systemctl reload httpd
? 补充技巧:若需批量禁止多个敏感目录(如 uploads/、cache/),可用正则
<DirectoryMatch "/var/www/html/(dont_interpret_php|uploads|cache)">
<FilesMatch "\.php$">
SetHandler None
</FilesMatch>
AddType text/plain .php
</DirectoryMatch>总结:现代 Apache + PHP 的解耦设计提升了配置灵活性与安全性。理解 SetHandler 替代 AddHandler 的机制,是精准控制 PHP 执行边界的基础;结合



















