根本原因是Apache未指向CI4的public目录且mod_rewrite未生效;必须将DocumentRoot设为public路径、启用mod_rewrite模块、配置AllowOverride All,并确保.env位于项目根目录且无BOM。

CI4 在 XAMPP 上跑不起来、URL 里始终带 index.php、访问直接 500 或空白页——根本原因不是框架写错了,而是 Apache 根目录没对准 public/,且 mod_rewrite 没真正生效。
Apache 必须指向 CI4 的 public/ 目录作为 DocumentRoot
CI4 不再允许把整个项目丢进 htdocs 后直接访问 index.php。否则 WRITEPATH 解析为 ../writable 却实际落在 htdocs/writable,日志和缓存全写失败。
- 改虚拟主机配置:编辑
X:\xampp\apache\conf\extra\httpd-vhosts.conf,添加完整区块(路径按你实际项目位置替换):<virtualhost> DocumentRoot "X:/xampp/htdocs/myproject/public" ServerName localhost.myproject <directory> AllowOverride All Require all granted </directory></virtualhost> - 别用符号链接应付:Windows 的
mklink /D容易因权限或 UAC 导致 Apache 读不到.htaccess,尤其在 PHP 8.1+ 下更敏感 - 改完必须重启 Apache,且要确认浏览器访问的是
http://localhost.myproject/(不是http://localhost/myproject/)
.htaccess 放错位置或内容不匹配会导致 500 错误
.htaccess 必须放在 public/ 目录下(即 Web 根目录),不是项目根目录,也不是 app/ 下。内容也得适配 CI4 的入口结构。
- 正确内容(CI4 官方推荐):
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^/index\.php RewriteRule ^(.*)$ index.php/$1 [L] - 如果用的是旧版写法(如
^.*$或带[QSA,PT,L]),在 XAMPP 8.0+(含 PHP 8.0)上可能触发 Apache 内部重定向循环,返回 500 - 测试是否生效:在
public/下放一个空.htaccess,访问http://localhost.myproject/test(路径不存在),若返回 500 就说明mod_rewrite没启用或AllowOverride仍为None
mod_rewrite 启用后仍无效的三个硬性检查点
即使 httpd.conf 里取消了注释,也不代表模块真加载了。Windows 下常因路径权限或模块文件缺失静默失败。
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 确认
X:\xampp\apache\modules\mod_rewrite.so文件真实存在(不是 0 字节) - 检查
X:\xampp\apache\logs\error.log,搜索mod_rewrite或Invalid command 'RewriteEngine'—— 出现就说明模块根本没加载 -
AllowOverride All必须写在对应<directory></directory>块里,且该块路径要精确匹配你的public/路径;写成<directory></directory>是无效的
.env 文件被忽略是开发模式失效的最常见盲区
CI4 默认用 $_SERVER['CI_ENV'] 判定环境,但 XAMPP 的 Apache 进程在 Windows 下不自动传这个变量,.env 又极易因隐藏属性或 BOM 头被跳过。
-
.env必须位于项目根目录(与app/、public/同级),不能放public/下 - 右键 → 属性 → 取消勾选「隐藏」;用记事本打开 → 另存为 → 编码选「UTF-8」(不是 UTF-8-BOM)
- 手动在
public/index.php顶部加一行强制定义:putenv('CI_ENVIRONMENT=development');,比依赖.env更可靠
真正卡住的人,往往反复检查 config.php 却漏掉 DocumentRoot 指向错误,或以为 .htaccess 放对了位置其实还在项目根目录。CI4 的入口机制和旧版 CI 完全不同,照搬 CI3 教程必踩坑。










