.env文件只该存环境变量,不该被业务代码直接读取;env()函数仅限config/目录使用,app_env与app_debug须严格匹配环境,敏感字段不可留空或提交至git,配置缓存为生产环境强制要求。

直接说结论:.env 文件只该存环境变量,不该被业务代码直接读取;配错最常导致「本地能跑、线上炸锅」「缓存后配置失效」「敏感信息意外泄露」三类问题。
env() 函数只能用在 config/ 目录下,别在控制器或模型里调用
很多人在 app/Http/Controllers/UserController.php 里写 env('DB_PASSWORD'),这看着能运行,但一执行 php artisan config:cache 就返回 null —— 因为缓存生成的是纯 PHP 数组,env() 函数此时已不生效。
- ✅ 正确位置:只出现在
config/database.php、config/services.php这类文件里 - ❌ 错误位置:控制器、模型、服务类、中间件、Blade 模板中
- 替代方案:要用某个值时,统一走
config('database.connections.mysql.password')
APP_ENV 和 APP_DEBUG 必须严格匹配部署环境
APP_ENV=local 却部署到生产服务器,会导致 APP_DEBUG=true 被暴露,错误页直接打印数据库连接串、路径、环境变量全量内容——这是高危安全漏洞。
- 开发环境:设置
APP_ENV=local+APP_DEBUG=true - 测试环境:设置
APP_ENV=testing+APP_DEBUG=false - 生产环境:必须是
APP_ENV=production+APP_DEBUG=false,且.env文件权限设为600 - 注意:
APP_ENV值不能随便写,Laravel 内部用它判断是否启用调试工具栏、日志级别、异常渲染方式
敏感字段别留空缺省值,尤其 DB_PASSWORD 和 APP_KEY
DB_PASSWORD= 看似无害,但若数据库允许空密码登录(比如某些本地 MySQL 配置),就等于裸奔;而 APP_KEY 留空会导致加密 Session、Cookie、Signed URL 全部失效,用户反复登出、CSRF 校验失败。
-
APP_KEY必须用php artisan key:generate生成,不能手写或复制别人项目里的 -
DB_PASSWORD若为空,应显式写成DB_PASSWORD="",避免被env()解析成字符串" "或触发意外 fallback - 所有含密钥、密码、Token 的字段,禁止在 Git 提交中出现,确保
.env在.gitignore里
最容易被忽略的点:配置缓存不是“可选优化”,而是生产环境强制要求;一旦开了 config:cache,.env 文件就只在启动时读一次,改了 .env 不重启 PHP-FPM 或重跑 config:clear,新值永远进不来。











