laravel环境判断唯一依据是app_env配置值,需通过php artisan env、cat .env | grep app_env或app()->environment()等多方式验证,.env缺失或格式错误时默认回退production。

要确认 Laravel Homestead 或 Sail 虚拟机当前运行的环境(比如 local、development 还是 production),关键不是看虚拟机本身“叫什么”,而是看 Laravel 应用实际加载的环境配置。Homestead 和 Sail 都只是容器/虚拟机载体,真正的环境由 Laravel 的 .env 文件和 APP_ENV 配置决定。
直接查看 Laravel 应用的实际环境
无论你用的是 Homestead(Vagrant + VirtualBox)还是 Sail(Docker),只要应用已启动,就可以通过以下方式快速确认:
- 进入项目根目录,在终端中执行:
php artisan env(Laravel 9+ 内置命令,直接输出当前APP_ENV值) - 或手动检查:
cat .env | grep APP_ENV(Linux/macOS)type .env | findstr APP_ENV(Windows CMD)Get-Content .env | Select-String APP_ENV(PowerShell) - 注意:如果
.env不存在或未定义APP_ENV,Laravel 默认回退为production—— 这正是很多人在 Homestead 中看到 “production” 却没改过环境的原因
区分 Homestead 与 Sail 的环境定位逻辑
两者机制不同,但目标一致:让 .env 在容器/虚拟机内生效。
-
Homestead:虚拟机启动后,你的 Laravel 项目代码通过共享文件夹挂载进 Ubuntu 系统;
.env文件必须放在本地项目根目录,且需确保 Homestead 的 Nginx 或 PHP-FPM 用户有读取权限(常见问题:.env 权限为 600 但 www-data 无法读) -
Sail:Docker 启动时会自动把本地
.env复制进容器(或通过docker-compose.yml的env_file指定);可进入容器验证:./vendor/bin/sail exec laravel.test cat /var/www/html/.env | grep APP_ENV - 小提示:Sail 默认使用
APP_ENV=local,Homestead 则完全依赖你本地.env的内容,无默认值
为什么有时显示 production?常见原因
不是虚拟机“设错了”,而是 Laravel 没读到有效环境配置:
-
.env文件缺失,或被.gitignore忽略后未手动创建 -
.env中写成了APP_ENV = local(等号前后有空格)→ Laravel 不识别,按空值处理 → 回退production - Homestead 中修改了
.env,但没重启 PHP-FPM:sail restart(Sail)或vagrant reload --provision(Homestead)非必需,但改完.env后应至少重启 FPM:sudo systemctl restart php7.4-fpm(Homestead Ubuntu) - 缓存干扰:执行过
php artisan config:cache后,.env修改不再实时生效,需清缓存:php artisan config:clear
快速验证环境是否生效(终端+浏览器双检)
光看配置不够,要确认 Laravel 真正按该环境运行:
- 终端执行:
php artisan tinker→ 输入app()->environment(),返回字符串如"local" - 在路由中临时加一行:
Route::get('/env', function () { return app()->environment(); });→ 浏览器访问/env查看输出 - 观察调试工具栏(如 Laravel Debugbar)左下角显示的环境标签,或页面源码中是否加载了开发专用资源(如 Vite HMR 脚本)











