必须将.env、config/app.php中的真实密钥、config/database.php中的真实密码及runtime/目录排除在Git之外,因硬编码密钥会导致仓库泄露时凭据全暴露;.env须放根目录并加入.gitignore,配置文件中用env()读取且默认值仅为占位符。

绝对不能把含密钥的配置文件直接提交到 Git 仓库——尤其是 config/app.php、config/database.php 里写死的 app_key、password、host 等字段,一旦推送到公开或被入侵的远程仓库,数据库、Redis、第三方 API 凭据全暴露。
哪些配置文件必须从 Git 中排除
ThinkPHP 6+ 默认敏感项集中在以下位置,需确保它们不进版本库:
-
.env文件:必须放在项目根目录,且已加入.gitignore;它承载APP_KEY、DB_PASSWORD等所有运行时密钥 -
config/app.php中的'app_key' => env('APP_KEY', 'xxx'):这里的默认值('xxx')只是占位符,绝不能是真实密钥 -
config/database.php中的'password' => env('DB_PASSWORD', ''):同理,空字符串或占位符可接受,但真实密码必须由.env提供 -
runtime/目录:完全自动生成,含缓存、日志、模板编译结果,必须禁止提交(已在 ThinkPHP 默认.gitignore中)
为什么用 env() 而不是硬编码
硬编码配置在开发、测试、生产环境切换时极易出错,而 env('DB_HOST', '127.0.0.1') 这种写法带来三重保障:
- 本地开发用
.env里的DB_HOST=192.168.10.10,线上部署改.env即可,无需动代码 - 框架启动时自动加载
.env,但仅当php think optimize:config编译后才固化进缓存——若.env缺失或格式错误(比如漏掉base64:前缀),APP_KEY会退回到默认值,导致 500 错误 -
env()是轻量函数,比Env::get()少一次类加载,性能更稳
部署前必须验证的三个检查点
Git 推送前或服务器拉取后,快速确认是否埋雷:
立即学习“PHP免费学习笔记(深入)”;
- 执行
git status,确认.env不在待提交列表中;若显示为untracked,说明还没加进.gitignore,立刻补上 - 在服务器上运行
php think run或访问首页,再看runtime/log/下最新日志是否有Environment variable "APP_KEY" is not defined—— 有则说明.env没生效或路径不对(必须在项目根目录,不能放public/下) - 执行
php think route:list,若报Class 'think\facade\Route' not found,大概率是config/app.php被覆盖或app_debug关闭导致错误不输出,得回退该文件
最易被忽略的是 .env 文件权限和 Web 根目录隔离:Nginx 的 root 必须指向 public/,且要显式禁止访问 .env(如加 location ~ /\.env { deny all; }),否则 URL 输入 http://yoursite.com/.env 可能直接下载明文密钥。



















