.env文件绝不能提交到代码仓库,因Git分布式特性会使敏感值永久固化在历史快照中,即使删除或修改也无法清除远程、fork、CI及爬虫已捕获的记录;须在.gitignore中强制添加.env、.env.*和Runtime/,并提供.env.example模板。

.env 文件里的敏感参数**绝对不能提交到代码仓库**。
Git 的分布式特性决定了:只要一次 git commit,敏感值就永久固化在历史快照里;哪怕后续 git rm 或改名,远程仓库、fork 记录、CI 缓存、甚至爬虫快照都可能已留存。真实案例里,AWS 密钥泄露 24 小时内就被扫号跑空云资源。
为什么 .env 提交 = 直接交出数据库和 API 控制权
ThinkPHP 不会自动过滤 .env 中的 DB_PASSWORD、APP_KEY、REDIS_PASSWORD 等字段——它原样加载进环境变量,再被配置文件通过 env('DB_PASSWORD') 拿走。一旦该文件进 Git,攻击者 clone 后执行 php think optimize:config 就能还原出完整数据库连接串,连端口、用户名、密码全齐。
.gitignore 必须包含这三行
不是“建议”,是上线前强制检查项:
.env-
.env.*(防误提交.env.production等) -
Runtime/(含日志、缓存,同样含敏感上下文)
同时补一个 .env.example 放进仓库:只留键名,不填值,比如 DB_HOST=、APP_KEY=,供新成员快速对齐变量结构。
部署后最容易漏掉的两个验证点
很多团队删了 .env 还报错,是因为没确认这两件事是否生效:
立即学习“PHP免费学习笔记(深入)”;
- Web 服务器用户(如
www-data)能否读取根目录下的.env?权限不够会导致 ThinkPHP 静默跳过加载,降级用配置文件里的默认值(可能是测试库地址) - 修改
.env后有没有清配置缓存?runtime/config.php是合并结果的快照,不删它或不运行php think clear:config,改了也白改
.env 不是“配置开关”,它是运行时注入的源头。它的安全性不取决于你写了什么,而取决于它是否彻底脱离 Git 历史、是否被 Web 服务正确读取、是否在每次部署后被重新校验。



















