CodeIgniter 4 必须将 Web 服务器 DocumentRoot 指向 public/ 目录,否则首页无法访问;Apache 需设 DocumentRoot 为 /var/www/myapp/public 并启用 AllowOverride All,Nginx 需配置 try_files $uri $uri/ /index.php?$query_string,APP_ENV 和 APP_DEBUG 需通过 SetEnv 显式设置,sess_save_path 应使用 FCPATH . 'writable/sessions' 确保绝对路径正确。

public/ 目录,不是项目根目录;否则首页都打不开,更别说路由跳转。CI3 虽可指向根目录,但现代部署中也建议统一用 public/ 入口模式——省去 index.php 路径干扰,也避免敏感目录被直接访问。
Apache 下 DocumentRoot 必须设为 public/ 目录
CI4 的 index.php 不在项目根目录,而在 public/ 子目录里。如果 Apache 的 DocumentRoot 指向 /var/www/myapp,用户访问时会看到 403(目录禁止列表)或空白页,因为 index.php 不在 Web 可达路径中。
-
DocumentRoot必须写成:"/var/www/myapp/public" - 对应
<directory></directory>块路径也要同步改,不能漏:<directory></directory> - 必须包含
AllowOverride All——仅FileInfo或None会导致.htaccess重写规则完全失效 - 修改后要
sudo systemctl reload apache2(Ubuntu/Debian)或sudo apachectl graceful(macOS)才生效
Nginx 的 try_files 是 404 的唯一解药
Nginx 没有 .htaccess,所有重写逻辑必须硬编码在 server 块里。漏掉 try_files 或写错格式,就会导致除 / 外所有 URL 返回 404。
- 核心语句必须是:
try_files $uri $uri/ /index.php?$query_string; - 注意结尾的
$query_string—— 省略它,$_GET参数全丢,路由和分页都会崩 - 若用 CI4 的
public/入口模式,root应设为/var/www/myapp/public,且location /中的/index.php前**不能加路径前缀**(即不要写成/public/index.php) -
location ~ \.php$块中,fastcgi_param SCRIPT_FILENAME必须用$realpath_root$fastcgi_script_name,硬编码路径在符号链接环境下必出502 Bad Gateway
APP_ENV 和 APP_DEBUG 得靠 SetEnv 显式传入
CI4 不从 .env 文件自动加载环境变量(尤其在 Apache 下),不显式设置会导致 APP_ENV=production、APP_DEBUG=false,结果就是错误全被吞掉,只显示白屏或 “Whoops!”。
- 在虚拟主机配置里加两行:
SetEnv APP_ENV development和SetEnv APP_DEBUG true - 别写成
SetEnv APP_DEBUG "true"—— CI4 内部用严格字符串比较,只认无引号的小写true - 生产环境务必改成
SetEnv APP_DEBUG false,否则$_SERVER、数据库连接信息可能泄露 - 若用 PHP-FPM,得改用
php_admin_value[env[APP_ENV]]方式传递,SetEnv无效
sess_save_path 错配比权限问题更常见
报 mkdir(): Invalid path?90% 不是 chmod 没到位,而是 $config['sess_save_path'] 根本没设对。PHP session 扩展不报错,但 CI 的 Session_files_driver 会主动调用 mkdir() 并炸掉。
- 绝对路径唯一安全写法:
$config['sess_save_path'] = FCPATH . 'writable/sessions'; -
FCPATH是 CI 自带常量,指向public/目录,确保拼出来的是完整绝对路径 - 手动创建目录:
mkdir -p /var/www/myapp/writable/sessions,再chown www-data:www-data /var/www/myapp/writable - 缺
x权限也会失败:运行ls -ld /var/www/myapp/writable,确认输出含r-x(如drwxr-xr-x),否则补一句chmod +x /var/www/myapp/writable
DocumentRoot 指向错了目录却还在调试 .htaccess,或者以为 chmod 777 能解决一切,却没意识到 sess_save_path 根本没拼对路径。先盯死这四点,95% 的本地启动失败都能当场定位。


















