codeigniter 本身不依赖 vagrant,但用 vagrant 搭建 ci 开发环境可实现本地开发、环境一致、开箱即用;根本原因在于 vagrant 默认不安装配置 web 服务、不设正确 documentroot(ci4 必须为 public/,ci3 须指向 index.php 所在目录),且共享目录需显式映射到 /var/www/ 而非默认 /vagrant。

直接说结论:CodeIgniter 本身不依赖 Vagrant,但用 Vagrant 搭建 CI 开发环境,能真正实现「本地开发、环境一致、开箱即用」——前提是 Vagrantfile 配置得当,且不把 Vagrant 当成 Docker 用。
为什么不能直接 vagrant up 就跑通 CodeIgniter?
常见错误是把 Vagrant 当成“一键启动 PHP 环境”的黑盒工具,结果 vagrant up 后访问 http://localhost:8080 显示 404 或空白页。根本原因在于:Vagrant 默认不装 Apache/Nginx、不配虚拟主机、不设 DocumentRoot 指向 public/(CI4)或 index.php 所在目录(CI3)。
- Vagrant 只负责启动虚拟机,Web 服务需手动安装配置(比如
apt install apache2+ 启用mod_rewrite) - CI4 要求 Web 根目录必须是
public/,不是项目根目录;CI3 则通常把index.php放在 Web 可访问路径下 -
/vagrant共享目录默认挂载到虚拟机/vagrant,但 Apache 的DocumentRoot默认是/var/www/html,两者不自动关联
正确配置 Vagrantfile 的关键参数
Vagrantfile 不是模板填充游戏,几个核心配置项写错,整个环境就起不来。重点盯住以下三项:
-
config.vm.synced_folder "./", "/var/www/my_ci_app":把当前项目目录映射到虚拟机的 Web 目录,而不是默认的/vagrant config.vm.provision "shell", inline: :必须包含 Apache 安装、<code>a2enmod rewrite、站点启用、DocumentRoot 指向/var/www/my_ci_app/public(CI4)或/var/www/my_ci_app(CI3)-
config.vm.network "forwarded_port", guest: 80, host: 8080:端口映射别写反,guest 是虚拟机内端口(80),host 是宿主机端口(如 8080)
示例片段(CI4 场景):
config.vm.provision "shell", inline:
DocumentRoot /var/www/my_ci_app/public
<directory>
AllowOverride All
Require all granted
</directory>' > /etc/apache2/sites-available/my_ci.conf
a2ensite my_ci.conf
systemctl restart apache2
SHELL
CI3 和 CI4 在 Vagrant 中的路径处理差异
这个坑踩过的人基本都要重装一次 box。CI3 和 CI4 对入口文件位置、URL 路由、base_url 的理解完全不同,Vagrant 内的 Web 配置必须跟着变:
- CI3:
index.php通常放在项目根目录,DocumentRoot设为/var/www/my_ci_app,$config['base_url']填http://localhost:8080/ - CI4:
index.php必须在public/子目录,DocumentRoot必须指向/var/www/my_ci_app/public,否则路由和静态资源全部 404 - CI4 的
.env文件里app.baseURL要设为http://localhost:8080/,不能留空或填/
比配置更常被忽略的点:权限与共享文件系统延迟
Vagrant 的 synced_folder 在 VirtualBox 下默认用 vboxsf,它不支持 Linux 文件权限继承和符号链接。这会导致两个典型问题:
- CI4 的
writable/目录在虚拟机内被识别为只读,日志、缓存写入失败,报错类似Unable to write to Cache path - 运行
composer install后,vendor/里的 symlink(比如phpunit)在宿主机上不可见,导致测试命令在宿主机执行时报command not found - 解决办法:改用
rsync同步模式(加type: "rsync"),或在 VirtualBox 中启用 Guest Additions 并用virtualbox/synced_folders插件
一句话收尾:Vagrant + CodeIgniter 的价值不在“能不能跑”,而在“换机器、换人、换时间,环境行为完全一致”。但这份一致性,要靠你亲手拧紧每颗螺丝,而不是靠 vagrant init 自动生成的默认配置。











