为Apache虚拟主机添加CGI指令后出现404未找到错误排查
问题描述
我在Windows 10系统的Apache 2.4中尝试同时运行两个PHP版本:PHP7通过mod方式配置,PHP8计划通过CGI方式配置。分别用HTTP和HTTPS虚拟主机测试,httpd-vhosts.conf中的配置如下:
<VirtualHost 0.0.0.0:80> SetEnv PHPRC "C:/Program Files/PHP/php-8.1.12/" ScriptAlias /php8112/ "C:/Program Files/PHP/php-8.1.12/" Action application/x-httpd-8112 "/php8112/php.exe" AddType application/x-httpd-8112 .php <Directory "C:/Program Files/PHP/php-8.1.12/"> <Files "php.exe"> Require all granted </Files> </Directory> DocumentRoot "D:/Test/Site/public" ServerName test.local CustomLog "C:/Users/me/Logs/test_access.log" combined ErrorLog "C:/Users/me/Logs/test_error.log" </VirtualHost> <VirtualHost 0.0.0.0:443> DocumentRoot "D:/Test/Site/public" ServerName test.local SSLEngine on SSLCertificateFile "C:/Program Files/Apache24/conf/server.cert" SSLCertificateKeyFile "C:/Program Files/Apache24/conf/server.key" </VirtualHost>
在D:/Test/Site/public目录下有一个简单的index.php文件:
<?php phpinfo(); ?>
HTTPS访问能正常显示PHP Info页面,但HTTP访问时出现404未找到错误。试过调整指令顺序、添加DocumentRoot的目录指令,都没效果,请问原因是什么?
问题分析与解决
核心原因
HTTP虚拟主机的配置中,AddType指令把.php文件关联到了自定义的application/x-httpd-8112类型,但Apache默认的DirectoryIndex可能未包含index.php,或者CGI映射的路径处理逻辑导致请求无法正确匹配到文件。而HTTPS虚拟主机未配置CGI相关指令,直接继承了全局的mod_php(PHP7)配置,所以能正常解析index.php。
具体解决步骤
- 明确指定DirectoryIndex:在HTTP的
<VirtualHost>块中添加以下配置,确保Apache优先解析index.php作为目录首页:DirectoryIndex index.php index.html - 添加DocumentRoot目录权限配置:为站点根目录添加访问权限,确保Apache能读取该目录下的文件:
<Directory "D:/Test/Site/public"> Require all granted AllowOverride None </Directory> - 验证PHP CGI配置:确认
php-8.1.12目录下的php.exe可正常执行,且PHPRC指向的目录存在正确的php.ini文件;同时检查ScriptAlias的路径末尾斜杠与调用路径一致,避免路径解析错误。 - 查看错误日志定位细节:打开
C:/Users/me/Logs/test_error.log,查看具体错误信息(如权限提示、路径错误等),进一步精准排查问题。
补充说明
HTTPS虚拟主机因为没有单独配置CGI规则,直接使用了全局的mod_php(PHP7)来处理PHP文件,所以能正常访问index.php;而HTTP虚拟主机单独配置了PHP8的CGI处理规则,但缺少必要的目录索引和站点目录权限配置,导致Apache无法正确找到并处理index.php文件,最终返回404错误。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

