需在虚拟主机的块内显式添加sethandler application/x-httpd-php或addhandler application/x-httpd-php .php,因xampp默认仅对htdocs启用php解析,自定义documentroot不继承该配置。

虚拟目录里 PHP 文件直接下载或显示源码,不是 Apache 没启,而是 httpd-vhosts.conf 里漏配 PHP 处理器——XAMPP 默认只对 htdocs 启用 php_module,自定义 DocumentRoot 下必须手动加 <filesmatch></filesmatch> 或 AddHandler 规则。
Apache 虚拟主机没继承 PHP 解析能力
XAMPP 的主配置(httpd.conf)中,PHP 模块加载和 .php 后缀绑定只作用于默认 DocumentRoot(即 htdocs)。一旦你用 VirtualHost 指向其他路径(比如 C:/projects/myapp),那个目录默认不走 php_module,浏览器请求 .php 文件时,Apache 就当普通静态文件处理:要么返回源码(若未启用 text/plain MIME),要么触发下载(若客户端认出是可执行脚本但无 handler)。
解决方法是在对应 <virtualhost></virtualhost> 块内显式声明 PHP 处理逻辑:
- 确保
LoadModule php_module modules/libphp.so(Linux/macOS)或php8apache2_4.dll(Windows)已在httpd.conf中启用(XAMPP 8.0.30 默认已开) - 在
<virtualhost></virtualhost>内添加以下任一方式(推荐第一种):
<directory>
AllowOverride All
Require all granted
<filesmatch>
SetHandler application/x-httpd-php
</filesmatch></directory>
或者用更老但兼容性更强的写法(适用于某些旧版模块):
AddHandler application/x-httpd-php .php
注意:AddHandler 必须放在 <directory></directory> 块里,不能只写在 VirtualHost 顶层;否则 Apache 会忽略。
mod_rewrite 开启后仍报 404 或 PHP 不执行
很多图床、CMS(如 Chevereto、Lychee)依赖重写 + PHP 共同工作。如果开了 mod_rewrite 但 PHP 还是不解析,大概率是 .htaccess 里的 AddHandler 或 SetHandler 被父级配置覆盖了。
检查点包括:
-
httpd-vhosts.conf中该<directory></directory>块的AllowOverride必须为All(不能是None或FileInfo),否则.htaccess里的 PHP 相关指令无效 -
.htaccess文件本身需放在虚拟目录根下,且内容含明确 handler 声明,例如:RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteRule ^(.*)$ index.php [QSA,L]<br><ifmodule mod_php.c><br> AddHandler application/x-httpd-php .php<br></ifmodule> - Windows 下注意路径分隔符用正斜杠
/,别用反斜杠\,否则<directory></directory>匹配失败
PHP-FPM 模式下虚拟目录彻底不认 .php
XAMPP 8.0.30 默认用模块模式(libphp),但如果你手动启用了 PHP-FPM(比如改过 httpd-xampp.conf),那所有虚拟主机都必须显式委托给 FPM socket,否则 PHP 文件一律不解析。
此时必须在 <virtualhost></virtualhost> 内补全代理配置:
<filesmatch>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</filesmatch>
并确认:
-
php-fpm.exe已启动(XAMPP 控制面板里勾选 PHP-FPM) -
httpd-xampp.conf中ProxyPassMatch或SetHandler未被重复/冲突定义 - Windows 下 FPM 默认监听
127.0.0.1:9000,不是 Unix socket(php-fpm.sock在 Windows 不生效)
最容易被忽略的是:XAMPP 虚拟主机的 DocumentRoot 路径权限和大小写敏感性。Windows 下路径不区分大小写,但 Apache 配置里的 <directory></directory> 和实际磁盘路径 C:\projects\myapp 若字母大小写不一致,AllowOverride 和 SetHandler 可能静默失效——建议全部统一用小写路径,避免踩坑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











