Apache禁止PHP执行的核心是切断文件与PHP处理器的绑定关系,推荐用SetHandler None清除处理器或php_flag engine off关闭引擎,需据运行模式(模块/FPM)和配置权限选择合适方式。

在 Apache 中禁止执行 PHP 等动态脚本,核心思路是**切断文件与 PHP 处理器的绑定关系**,而不是简单删文件或改权限。关键在于配置层级(主配置、虚拟主机、目录)和指令组合的正确使用。现代 Apache(2.4.17+)已弃用旧式 AddHandler,推荐用 SetHandler + <filesmatch></filesmatch> 或 php_flag engine off 实现精准控制。
全局禁用 PHP 解析(彻底停用)
若服务器完全不需要 PHP,最干净的做法是卸载模块或注释加载行:
- 检查模块加载:运行
grep -r "LoadModule.*php" /etc/httpd/(CentOS/RHEL)或grep -r "LoadModule.*php" /etc/apache2/(Debian/Ubuntu) - 注释掉类似
LoadModule php_module modules/libphp.so或LoadModule mpm_prefork_module modules/mod_mpm_prefork.so(PHP-FPM 模式下需确保 prefork 已启用)的行 - 重启 Apache:
sudo systemctl restart httpd或sudo systemctl restart apache2
按目录禁用 PHP 执行(推荐场景)
对上传目录、缓存目录等无需执行脚本的位置,应在 <directory></directory> 块中覆盖处理器行为。以下两种方式均有效,优先选第一种(兼容性更好):
-
方式一:清除处理器绑定(推荐)
在/etc/httpd/conf.d/your-site.conf或虚拟主机配置中添加:
<FilesMatch "\.(?i:php|php3|php4|php5|phtml|phar)$">
SetHandler None
</FilesMatch>
</Directory>
-
方式二:关闭 PHP 引擎
适用于模块化 PHP(如 libphp.so),需确保php_flag指令可用(非 FPM 模式):
php_flag engine off
</Directory>
- 注意:
php_flag在 PHP-FPM 模式下不可用,会报错;且该指令不能用于.htaccess(除非允许AllowOverride Options=All)
用 .htaccess 临时限制(共享主机适用)
若无服务器主配置权限,可在目标目录放 .htaccess:
立即学习“PHP免费学习笔记(深入)”;
<FilesMatch "\.(?i:php|php3|php4|php5|phtml)$">Require all denied
# Apache 2.4+ 推荐写法,替代旧版 Order/Deny
</FilesMatch>
- 必须确保主配置中该目录允许
AllowOverride All或至少AllowOverride Options=All -
Require all denied是 Apache 2.4 的标准访问控制语法,比旧版Order Deny,Allow更安全明确
验证是否生效
禁用后务必测试,避免配置未加载或被覆盖:
- 创建测试文件:
echo '<?php echo "exec works"; ?>' > /var/www/html/uploads/test.php - 用浏览器或 curl 访问:
curl -I http://yoursite.com/uploads/test.php - 预期响应状态码应为
403 Forbidden或直接返回纯文本(不解析 PHP),而非200 OK并输出内容 - 检查是否被其他配置覆盖:
apachectl -t -D DUMP_INCLUDES查看实际加载的配置顺序



















