Apache执行PHP需先加载php_module并配置AddType与AddHandler,否则.php文件将显示源码或报500错误;Linux用a2enmod启用模块,Windows检查httpd.conf中LoadModule路径,还需设置DirectoryIndex包含index.php并验证phpinfo()中“Server API”字段。

Apache 要能执行 PHP 代码,不是装完就自动生效的——它默认把 .php 文件当纯文本发给浏览器,所以你会看到源码,或者直接报 500 错误。核心问题就一个:Apache 必须明确加载 PHP 模块,并把 .php 扩展名交给它处理。
怎么确认 Apache 已加载 php_module
没加载模块,后面全白搭。Linux 下用 apache2ctl -M | grep php(Ubuntu/Debian)或 httpd -M | grep php(RHEL/CentOS),Windows 下用 httpd -M | findstr php。输出里必须有类似 php_module (shared) 的行。
- 如果没出现,说明模块根本没启用:Linux 运行
sudo a2enmod php8.1(版本号按实际改),Windows 则检查httpd.conf中LoadModule php_module行是否取消注释、路径是否指向真实存在的.dll或.so文件 - 路径写错是最常见原因:比如 Windows 上写了
php8apache2_4.dll,但实际文件是php8apache2_4.dll(少个下划线)或版本不匹配(Apache 2.4 却用了php7apache2_2.dll) - Linux 用户注意:
libapache2-mod-php包必须和 PHP 版本严格对应,apt install php8.1后还得装libapache2-mod-php8.1,只装 PHP 不装模块包,a2enmod也找不到模块
AddType 和 AddHandler 该用哪个
两者都得设,但作用不同:AddType 告诉 Apache “这是什么类型文件”,AddHandler 告诉 Apache “交给谁处理”。只设一个,PHP 文件仍可能被下载或显示源码。
- 必须同时存在:
AddType application/x-httpd-php .php+AddHandler application/x-httpd-php .php - 新版 Apache(2.4+)更推荐用
<FilesMatch ".php$"> SetHandler application/x-httpd-php </FilesMatch>,语义更清晰,且避免扩展名冲突 - 别漏掉常见入口文件:如果项目用
index.php作首页,还要确保DirectoryIndex包含它,例如DirectoryIndex index.php index.html,否则访问目录时会 403 或返回目录列表
Windows 下 PHPIniDir 为什么总报错
PHPIniDir 是 Apache 找 php.ini 的唯一依据,路径错一个字符、多一个空格、用了反斜杠没转义,都会导致 Apache 启动失败或 PHP 功能异常(如 MySQL 扩展不加载、错误不显示)。
立即学习“PHP免费学习笔记(深入)”;
- 路径必须是绝对路径,且**不带引号**(除非路径含空格):
PHPIniDir "C:/php"或PHPIniDir C:/php;PHPIniDir "C:/Program Files/php"才需要引号 - 路径分隔符统一用正斜杠
/,不要混用\,Windows 也认/,但\在配置里容易被误解析为转义 -
php.ini文件本身必须存在:从php.ini-development复制重命名为php.ini,再修改其中的extension_dir(例如extension_dir = "C:/php/ext"),否则即使模块加载成功,扩展也起不来
Mac 自带 Apache 怎么配 PHP
macOS 12+(Monterey 及之后)已移除系统自带的 PHP,但 Apache 仍保留。你不能靠 sudo apachectl start 就跑 PHP —— 因为没模块可加载。
- 先装 PHP:用 Homebrew
brew install php,它会把libphp.so放进/opt/homebrew/lib/httpd/modules/(Apple Silicon)或/usr/local/lib/httpd/modules/(Intel) - 编辑
/etc/apache2/httpd.conf,添加三行(路径按 brew 实际输出调整):LoadModule php_module /opt/homebrew/lib/httpd/modules/libphp.soAddHandler application/x-httpd-php .phpPHPIniDir /opt/homebrew/etc/php/8.3 - 重启前务必检查语法:
sudo apachectl configtest,报错就别重启,否则服务起不来 - 测试文件放
/Library/WebServer/Documents/,而不是用户目录,权限问题在这里最常卡住
最容易被忽略的是模块与 Apache 的 ABI 兼容性:比如用 Apache 2.4.58 编译的 php8apache2_4.dll,绝不能塞进 Apache 2.2 或 2.5 的环境里。查清双方版本再动手,比反复重启省半小时。



















