最常见原因是Apache未启用PHP模块,导致.php文件被当作纯文本返回;需检查php_module是否加载、配置AllowOverride和Require权限、AddType映射、SELinux上下文及文件权限。
Apache没启用PHP模块,phpMyAdmin直接当纯文本返回
这是最常见原因:apache根本没把 .php 文件交给 php 解析,而是原样吐给浏览器。你看到的“源码”,其实是 html 里混着 php 标签的未执行结果,比如满屏的 <?php echo ... ?>。
检查方法很简单,在终端跑:
apachectl -M | grep php或者
httpd -M | grep php(取决于系统)。如果没输出,说明
php_module 没加载。
- 确认 PHP 包已安装(如 Ubuntu 的
libapache2-mod-php,CentOS 的php-fpm+mod_php或用proxy_fcgi) - Ubuntu/Debian 下运行
a2enmod php8.1(版本号按实际改),然后systemctl restart apache2 - CentOS/RHEL 8+ 若用
php-fpm,要确保proxy_fcgi和setenvif已启用,并在虚拟主机里配好ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/这类转发规则
phpMyAdmin目录没加AllowOverride All或Require all granted
即使 PHP 模块开着,Apache 默认可能禁止 .htaccess 覆盖行为,而 phpMyAdmin 依赖它来屏蔽敏感文件(如 config.inc.php)——但更关键的是,某些发行版打包的配置里漏掉了执行 PHP 的权限声明。
打开 Apache 站点配置(比如 /etc/apache2/sites-enabled/000-default.conf),找到 phpMyAdmin 对应的 <directory></directory> 块:
- 必须有
AllowOverride All(让 .htaccess 生效)或至少AllowOverride FileInfo - 必须有
Require all granted(旧版是Order allow,deny+Allow from all) - 如果用了
php-fpm,还要加一行:<filesmatch> SetHandler "proxy:fcgi://127.0.0.1:9000"</filesmatch>
PHP 文件扩展名没被正确映射到处理器
Apache 不知道该用谁处理 .php,尤其在手动编译或容器环境里,AddType application/x-httpd-php .php 这类映射可能缺失。
查一下你的 mime.modules 或主配置里有没有这行:
- 有
LoadModule mime_module modules/mod_mime.so(必须启用) - 有
AddType application/x-httpd-php .php(注意不是text/html) - 如果用了多版本 PHP,还得加
AddHandler application/x-httpd-php .php,并确保对应SetHandler在目录块里生效
漏掉 AddType,Apache 就不会触发 PHP 处理器,哪怕模块已加载。
SELinux 或文件权限拦住了 PHP 解析
CentOS/RHEL 上 SELinux 默认会阻止 Apache 读取非标准路径下的 PHP 文件,尤其是你把 phpMyAdmin 解压到 /opt 或自定义目录时,浏览器看到源码,日志里却只有 Permission denied 类似提示。
- 临时验证:运行
setenforce 0,再刷新页面——如果好了,就是 SELinux 问题 - 永久修复:用
chcon -R -t httpd_sys_content_t /path/to/phpmyadmin,如果涉及写入(如上传、保存配置),还得加httpd_sys_rw_content_t - 同时确认文件属主是
root:www-data(Debian)或root:apache(RHEL),且目录至少是755,PHP 文件是644
权限和上下文不匹配时,Apache 宁可返回源码也不报错,这点特别容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











