apache虚拟主机必须启用mod_rewrite模块,codeigniter 4路由依赖url重写,xampp默认关闭该模块,不启用会导致非index.php路径返回404;需在httpd.conf中取消loadmodule rewrite_module行注释,并将对应directory区块的allowoverride none改为all,重启apache后通过.htaccess测试是否生效。

Apache 虚拟主机必须启用 mod_rewrite
CodeIgniter 4 的路由依赖 URL 重写,XAMPP 默认关闭该模块。不启用会导致所有非 index.php 路径返回 404(比如访问 /home 直接报错,而非触发 CI 的路由分发)。
操作步骤:
- 打开
XAMPP\apache\conf\httpd.conf - 取消注释这一行:
LoadModule rewrite_module modules/mod_rewrite.so - 找到
<directory></directory>区块(路径按你实际安装盘符调整),把里面的AllowOverride None改为AllowOverride All - 重启 Apache
验证是否生效:在 htdocs 下放一个空的 .htaccess 文件,访问时若返回 500 错误,说明 mod_rewrite 未启用或语法不被允许;若无反应或正常加载,则大概率已就绪。
CodeIgniter 4 的 public 目录必须设为 Web 根目录
CI4 不再把全部代码放在 htdocs 下运行,而是要求 Web 服务器直接指向 public 子目录。否则 index.php 无法正确加载框架核心,会爆出 Cannot find app/Config/App.php 或空白页。
两种常用做法:
-
改虚拟主机根目录:在
httpd-vhosts.conf中配置DocumentRoot "X:/xampp/htdocs/myproject/public",并确保对应<directory></directory>路径也指向该位置 -
用符号链接(Windows 命令提示符管理员权限):
mklink /D htdocs\myapp X:\xampp\htdocs\myproject\public,然后通过http://localhost/myapp/访问
注意:不要把整个 CI4 项目复制进 htdocs 后直接访问 htdocs/myproject/public/index.php —— 这样会导致 WRITEPATH 等常量解析错误,日志和缓存写入失败。
.env 文件权限与环境模式必须手动激活
XAMPP 默认以 Windows 用户身份运行 Apache,但 CI4 的 .env 文件在 Windows 下容易因隐藏属性或编码问题被忽略,导致始终运行在 production 模式,错误不显示、日志不写入。
关键检查点:
- 确认
.env文件位于项目根目录(与app/、public/同级),不是public/下 - 右键文件 → 属性 → 取消勾选「隐藏」,并用记事本另存为 UTF-8 编码(避免 BOM 头)
- 在
public/index.php顶部确认这行存在且未被注释:define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development'); - 在
.env中明确设置:CI_ENVIRONMENT = development
如果仍不生效,临时加一行调试:var_dump(ENVIRONMENT, dotenv_loaded()); die; 在 index.php 开头,看是否读取到变量及文件是否存在。
MySQL 连接失败常见于 socket 路径和认证插件
CI4 使用 PDO 连接 MySQL 时,在 XAMPP 环境下常卡在 Connection refused 或 Plugin auth_socket is not loaded,本质是 MySQL 配置与 PHP 扩展不匹配。
解决方式:
- 检查
app/Config/Database.php中的'hostname' => '127.0.0.1',不要写localhost(Windows 下localhost会走 socket,而 XAMPP 的 socket 路径常不一致) - 确认
php.ini中启用了extension=php_pdo_mysql.dll和extension=php_mysqli.dll - 若用 MySQL 8+,XAMPP 自带版本可能默认启用
caching_sha2_password插件,PHP 7.4 以下不兼容;可在 phpMyAdmin 中执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
数据库配置里的 'port' 一般不用填,除非你改过 MySQL 端口;但一旦填了就必须确保和 my.ini 中 [mysqld] port=3306 一致。










