codeigniter 4 运行需启用 apache mod_rewrite 模块、将 web 根目录设为 public/ 子目录、数据库 hostname 按场景配置(如本地用 127.0.0.1)、.env 文件须放项目根目录且无 bom 头。

mod_rewrite没开,所有非index.php路由都404
CodeIgniter 4 的 URL 路由完全依赖 Apache 的 mod_rewrite 模块。XAMPP 默认关闭它,所以访问 /home、/api/users 这类路径时,Apache 直接返回 404,根本不会把请求交给 CI 的 index.php 处理。
必须手动启用:
- 打开
XAMPP\apache\conf\httpd.conf - 找到
#LoadModule rewrite_module modules/mod_rewrite.so,删掉前面的# - 找到
<directory></directory>区块(路径按你实际盘符调整),把里面的AllowOverride None改成AllowOverride All - 重启 Apache —— 不重启不生效
验证方式:在 htdocs 下放一个空的 .htaccess 文件,用浏览器访问 http://localhost/.htaccess。如果返回 500 错误,说明模块没启用或语法被拒;如果返回 404 或空白,说明已就绪。
public 目录没设成 Web 根目录,直接白屏或报 Cannot find app/Config/App.php
CI4 不再支持把整个项目丢进 htdocs 运行。它的入口是 public/index.php,且框架内部大量依赖 WRITEPATH、APPPATH 等常量,这些路径的解析前提是 Web 服务器根目录必须指向 public/ 子目录。
两种可靠做法:
- 改虚拟主机配置:在
httpd-vhosts.conf中设置DocumentRoot "X:/xampp/htdocs/myproject/public",并同步更新对应<directory></directory>路径 - 用符号链接(Windows):管理员权限运行命令提示符,执行
mklink /D htdocs\myapp X:\xampp\htdocs\myproject\public,然后通过http://localhost/myapp/访问
千万别直接访问 http://localhost/myproject/public/index.php —— 这会导致 WRITEPATH 解析为错误路径,日志和缓存写入失败,后续调试全卡住。
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
数据库连不上:hostname 写 localhost 就错在局域网或远程场景
CI4 的数据库配置里 hostname 值不是“固定写 localhost”。它取决于你的使用场景:
- 本地开发(XAMPP 自带 MySQL):用
localhost或127.0.0.1都可以,但推荐127.0.0.1(绕过 DNS 解析,更稳定) - 连接局域网内另一台机器的 MySQL:填对方 IP,比如
192.168.1.100,确保对方 MySQL 开启了远程访问(user表中 host 字段含%或对应 IP) - 连接云服务器数据库:填公网 IP 或域名,确认云服务商安全组放行了 3306 端口
常见错误是死守 localhost,结果在跨设备调试时怎么都连不通。另外,port 字段别漏——XAMPP 默认是 3306,但如果改过端口(比如避让系统占用),就必须显式写上,如 'port' => '3307'。
.env 文件被忽略,环境始终卡在 production
Windows 下 CI4 很容易因为 .env 文件的隐藏属性或 BOM 头导致加载失败,结果 ENVIRONMENT 始终是 production,错误不显示、日志不写入、缓存不刷新。
关键动作只有三个:
-
.env必须放在项目根目录(和app/、public/同级),不能放public/下,也不能放app/Config/里 - 右键文件 → 属性 → 取消勾选「隐藏」;再用记事本打开 → 「另存为」→ 编码选「UTF-8」(不是 UTF-8-BOM)
- 确认
public/index.php顶部有这行且未注释:define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');,并在.env中明确写CI_ENVIRONMENT = development
最易被忽略的是 BOM 头——哪怕只多一个不可见字符,CI4 就静默跳过整个文件。建议用 VS Code 或 Notepad++ 查看编码,比记事本更靠谱。










