必须放在根目录,因laravel默认只从项目根目录加载.env;需通过web服务器配置(如apache的.htaccess或nginx的location规则)禁止直接访问,否则敏感信息将泄露。

生产环境部署后,.env 文件必须放在项目根目录,且不能被 Web 服务器直接访问——这是底线,不是可选项。
为什么必须放在根目录?
Laravel 启动时通过 bootstrap/app.php 中的 Dotenv\Dotenv 实例加载 .env,它默认只认项目根目录下的 .env(或你显式指定的路径)。改位置、改名、放子目录都会导致 env() 返回 null,数据库连不上、密钥缺失、APP_ENV 退化为 production 硬编码值。
-
Dotenv不会递归查找,也不会读取config/或storage/下的同名文件 - 重命名成
.env.production后不手动调用load()就等于没配 - 某些 PaaS(如 Laravel Forge)自动注入环境变量,此时
.env可为空,但文件仍需存在(否则部分 Artisan 命令会报错)
Web 服务器怎么防止 .env 被公开?
Apache 和 Nginx 默认都允许访问根目录下任意文件,.env 一旦被 HTTP 直接请求,敏感信息立刻泄露。必须加防护:
Laravel 13.2.0 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- Apache:在
.htaccess里加deny from all或RedirectMatch 403 \.env$ - Nginx:在 server 块中加
location ~ /\.env { deny all; } - 更稳妥的做法是把 Web 入口指向
public/目录,确保根目录本身不暴露给 HTTP —— 这才是 Laravel 推荐的部署结构
部署时怎么安全地写入 .env?
不能靠本地编辑再上传,也不能用 scp 直传明文文件。常见可靠方式:
- CI/CD 流水线中用 secret 注入变量,运行
echo "DB_PASSWORD=${DB_PASSWORD}" >> .env(注意追加而非覆盖,避免冲掉APP_KEY) - Docker 部署时用
docker run --env-file .env.production,同时在容器启动脚本里生成.env(env变量优先级高于文件,所以文件内容可精简) - 云平台(如 AWS Elastic Beanstalk)用
.ebextensions配置,在部署时从 Parameter Store 写入.env - 绝对禁止:
git push提交.env、用 FTP 编辑线上.env、在日志里dump(env('DB_PASSWORD'))
config:cache 之后 .env 还起作用吗?
起作用,但仅限于缓存构建阶段。执行 php artisan config:cache 后,所有 config/*.php 中的 env() 调用会被「求值并固化」进 bootstrap/cache/config.php。此后应用运行不再读取 .env 文件——改了也没用。
- 这意味着:上线前必须先改好
.env,再跑config:cache;中途想换 DB 密码?得重新缓存配置 + 重启 FPM - 也意味着:
APP_DEBUG=true即使写在.env里,只要缓存已生成,就无法动态开启调试面板 - 开发环境通常不跑
config:cache,所以.env始终实时生效;生产环境必须跑,这是性能与安全的硬性要求
真正容易被忽略的是:很多团队以为「只要 .env 在 .gitignore 里就安全了」,却忘了检查部署脚本是否意外覆盖、Nginx 是否漏配 .env 拦截、或者 config:clear 后忘记重跑 config:cache 导致配置回退到未缓存状态——这时候 .env 才真正开始决定行为,而它可能早已过期或权限错误。










