必须禁止外部访问 .env 文件,Nginx/Apache 配置拒绝请求,.env 加入 .gitignore 并设权限 600,禁用 APP_DEBUG,运行 config:cache,且不输出敏感环境变量。

防止 Laravel 的 .env 文件被直接访问,是上线前必须完成的基础安全动作。它不是“可选项”,而是攻击者第一眼就会尝试的突破口——一旦暴露,数据库密码、API 密钥、APP_KEY 全部可见。
Web 服务器层:禁止外部访问 .env
这是最直接、最有效的防线,必须在 Nginx 或 Apache 中配置,让请求 /.env 时返回 403 或 404:
-
Nginx:在站点配置中添加
location ~ /\.env { deny all; } -
Apache(启用 mod_rewrite):在项目根目录新建
.htaccess,内容为<Files ".env">Order Allow,Deny</Files>或更严格写法<Files ".env">Require all denied</Files> - 同时确保
/bootstrap/cache/和/storage/logs/也被禁止访问,例如 Nginx 中加location ^~ /bootstrap/cache { return 403; }location /storage/logs { deny all; }
代码与部署层:隔离 + 权限控制
服务器配置只是兜底,源头控制更关键:
- 确认
.env已加入.gitignore;若历史已误提交,需用git rm --cached .env清除追踪并重置 - 生产环境不复制本地
.env,改用 CI/CD 安全变量注入,或通过服务器环境变量(如export DB_PASSWORD=xxx)传递 - Linux 下将
.env文件权限设为600(仅所有者读写):chmod 600 .env - 不要在 Blade 模板、控制器响应或日志中输出
env()值,尤其避免{{ env('DB_PASSWORD') }}这类写法
运行时加固:切断泄露路径
即使文件物理不可达,也要防止它被“间接”读出:
- 设
APP_DEBUG=false且APP_ENV=production,否则错误页可能意外打印.env内容 - 运行
php artisan config:cache后,配置固化为 PHP 数组,env()不再生效——此时务必保证所有env()调用都已在 config 文件中封装,并设了合理默认值 - 检查
config/app.php等文件,确认没有硬编码敏感值;所有密钥类配置只通过env('KEY_NAME')获取
验证是否生效
上线前手动测试三件事:
- 浏览器访问
https://yourdomain.com/.env→ 应返回 403/404,不能看到明文内容 - 触发一个 500 错误(如访问不存在路由),页面不能出现 “Whoops”、堆栈、SQL 或
.env变量值 - 查看
storage/logs/laravel.log,确认日志里没记录数据库密码、密钥等敏感字段


















