codeigniter 4 的 apache 虚拟主机关键在于 documentroot 必须指向 public/ 目录,启用 allowoverride all 和 mod_rewrite,正确设置 writepath 权限及 $config['baseurl'] 以确保路由、session 和资源正常工作。

CodeIgniter 4 的 Apache 虚拟主机设置,关键不是“配虚拟主机”,而是让 Apache 正确把请求交给 public/index.php,同时确保重写规则和权限不卡住——否则所有非首页 URL 都 404,base_url 乱跳,session 写失败,上传直接中断。
DocumentRoot 必须指向 public/ 目录
CI4 不再允许从项目根目录(含 app/、system/)直接提供服务。Apache 的 DocumentRoot 必须设为 /var/www/myapp/public(Linux)或 E:/xampp/htdocs/myapp/public(Windows),否则会暴露敏感目录或触发 403。
- 错误做法:
DocumentRoot "/var/www/myapp"→ 访问http://site.test会显示空白或报错,且app/可被直接浏览 - 正确做法:
DocumentRoot "/var/www/myapp/public",并确认该路径下存在index.php和.htaccess - Windows XAMPP 用户:别改全局
httpd.conf的DocumentRoot,应单独为 CI4 创建VirtualHost块,避免影响其他项目
AllowOverride All + mod_rewrite 是硬性要求
CI4 的 URL 重写依赖 .htaccess 文件生效,而它只在 AllowOverride All 时才被读取。仅写 AllowOverride FileInfo 或留空,会导致除 / 外全部 404。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
mod_rewrite必须启用:sudo a2enmod rewrite(Debian/Ubuntu)或检查LoadModule rewrite_module modules/mod_rewrite.so是否在主配置中取消注释 -
Directory块内必须包含:AllowOverride All和Require all granted(Apache 2.4+) - 不要把
.htaccess放错位置:它必须在public/目录下,内容不能删减(尤其是RewriteBase /行,若部署在子路径需手动调整)
Session 和 writable 权限不是 chmod 777 的问题
CI4 启动时报 mkdir(): Invalid path 或 session 无法保存,90% 是因为 $config['sess_save_path'] 没设成绝对路径,或父目录不存在、无执行位(x)。
- 正确写法(在
app/Config/App.php中):$config['sess_save_path'] = WRITEPATH . 'session/';(WRITEPATH是 CI4 自带常量,指向writable/) - 手动创建目录:
mkdir -p /var/www/myapp/writable/session - 权限设置顺序不能错:
chown -R www-data:www-data /var/www/myapp/writable→chmod 700 /var/www/myapp/writable/session→chmod 755 /var/www/myapp/writable(writable/本身需 x 位,子目录 session 不需要)
HTTPS 和 ServerName 配置容易漏掉的细节
本地开发用 localhost 或自定义域名(如 ci4.test)时,ServerName 和 hosts 绑定只是第一步;若后续要启用 HTTPS 或用 base_url() 生成链接,App.php 中的 $config['baseURL'] 必须匹配实际访问协议和域名。
-
$config['baseURL'] = 'https://ci4.test/';→ 浏览器访问必须是https://ci4.test,否则 CSRF token、asset() 生成的链接会跨域失效 - Apache 的
VirtualHost若监听 443,必须加载mod_ssl并配置SSLCertificateFile和SSLCertificateKeyFile,否则httpd -t会报错 - 开发阶段用
http://ci4.test更稳妥;若用https://,推荐 mkcert 生成本地可信证书,避免浏览器拦截
最常被跳过的环节是:没验证 WRITEPATH 对应的物理路径是否真实存在、是否可被 Apache 进程写入、是否有执行位——这些不会在 apache2ctl -t 里报错,但会让整个应用静默崩溃。动手前先 ls -ld /var/www/myapp/writable 看一眼权限和归属。










