根本原因是PHP模块未启用或处理器未绑定——需四步修复:确认模块存在、启用加载、绑定.php后缀、验证生效;重点检查libphp.so路径、a2enmod启用、FilesMatch/SetHandler配置及phpinfo()返回Server API是否为Apache 2.4 Handler。

PHP文件在Apache中显示源码或被下载,根本原因是PHP模块未启用或处理器未绑定——不是PHP没装,而是Apache根本没把它当脚本执行。修复需分四步:确认模块存在、启用加载、绑定.php后缀、验证生效。
确认PHP模块文件是否存在
模块文件是基础,找不到就无从加载。
- Linux(Debian/Ubuntu):ls /usr/lib/apache2/modules/ | grep libphp,常见路径如/usr/lib/apache2/modules/libphp8.2.so
- Linux(CentOS/RHEL):find /usr -name "libphp*.so" 2>/dev/null
- Windows:dir "C:\php\php8apache2_4.dll"(注意版本号匹配Apache 2.4,且必须是Thread Safe版)
- 若无结果,说明PHP未以Apache SAPI方式安装,需重装并勾选“Apache 2.4 Handler”(Windows)或安装libapache2-mod-php包(Linux)
启用PHP模块加载
存在≠启用,必须让Apache在启动时实际载入该模块。
- Debian/Ubuntu系统:sudo a2enmod php8.2(版本号须与模块名一致),再sudo systemctl restart apache2
- CentOS/RHEL 8+:sudo dnf install php-fpm httpd后默认走PHP-FPM,不启用libphp.so;如需模块模式,需手动编译或启用php.conf中的LoadModule行
- Windows或自编译Apache:LoadModule php_module "C:/php/php8apache2_4.dll"必须写在httpd.conf中,且引号必须是英文半角",不能是中文弯引号“”或复制粘贴来的智能引号
- 关键验证:httpd -M | grep php(Linux/macOS)或httpd -M | findstr php(Windows),输出含php8_module (shared)才表示加载成功
绑定.php文件到PHP处理器
模块加载了,但Apache仍不知该对哪些文件调用它——必须明确声明处理规则。
立即学习“PHP免费学习笔记(深入)”;
- 推荐写法(Apache 2.4+):<FilesMatch \.php$>SetHandler application/x-httpd-php</FilesMatch>,放在<VirtualHost>或主配置的<Directory>块内
- 兼容写法:AddType application/x-httpd-php .php + AddHandler application/x-httpd-php .php
- 切勿遗漏:DirectoryIndex index.php index.html,否则访问目录时不会自动执行index.php
- 注意优先级:虚拟主机配置会覆盖全局配置;若站点启用了AllowOverride All,还要检查.htaccess是否意外清空或覆盖了处理器设置
验证并排查常见失败点
重启后别急着访问网页,先做两件事:语法检查 + 真实响应验证。
- 运行httpd -t(Linux/macOS)或httpd -t(Windows),返回Syntax OK才算配置无硬错误
- 在网站根目录(如/var/www/html或htdocs)新建info.php,内容仅:<?php phpinfo(); ?>
- 浏览器访问http://localhost/info.php,重点看顶部Server API字段:Apache 2.4 Handler表示成功;FPM/FastCGI说明实际走的是PHP-FPM,libphp.so未起作用
- 若仍下载或显示源码:立即查error.log(Linux路径如/var/log/apache2/error.log,Windows在logs/error.log),常见报错包括Cannot load modules/libphp.so: undefined symbol(OpenSSL版本冲突)、Permission denied(SELinux上下文或文件权限问题)



















