核心是web服务器根目录必须指向public/且.env权限与加载时机要卡准:documentroot需设为项目/public路径,.env须位于项目根目录并确保web进程可读,runtime目录需可写,否则90%的404、500、空白页等问题由此引发。

ThinkPHP6.1 部署到 Linux 服务器,核心就一条:public/ 必须是 Web 服务器的 DocumentRoot,且 .env 加载时机和权限必须卡准。其他所有报错——404、500、空白页、数据库连不上、路由不生效——90% 都卡在这两点上。
Web 服务器根目录必须指向 public/,不是项目根目录
TP6.1 强制将入口统一收束到 public/index.php,框架内部路径逻辑(如静态资源、路由解析、__ROOT__)全基于此推导。若 Nginx 或 Apache 的 root 指向项目根目录(比如 /var/www/html/tp6),就会直接暴露 .env、composer.json,且所有请求都绕过框架路由,返回 404 或原始 PHP 文件内容。
- Nginx 配置中
root必须写成完整路径 +/public,例如:root /var/www/html/tp6/public; - Apache 需确保
public/.htaccess存在且生效;检查对应<directory></directory>块中AllowOverride All已启用 -
宝塔面板建站时,“网站根目录”填的是
/var/www/html/tp6/public,不是/var/www/html/tp6 - 改完配置后,必须重启 Nginx/Apache 或点击宝塔「重载配置」,仅刷新浏览器无效
.env 文件不生效?先查加载时机和文件权限
.env 在 TP6.1 启动早期由 topthink/framework 的 EnvLoader 读取一次,之后全程缓存。它不会监听文件变化,也不会在 CLI 和 FPM 间共享状态。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 文件名必须是
.env(不是.env.example),且位于项目根目录(与think可执行文件同级) - Linux 下检查权限:
ls -l .env,确保 Web 进程用户(如www-data或nginx)有读取权限;常见错误是 root 创建后未改属主:chown www-data:www-data .env - 用
php think run开发服务器时,每次改.env都必须Ctrl+C终止再重跑;FPM 模式下需重启 PHP-FPM 进程 - 快速验证是否加载成功:在
app/common.php第一行加var_dump($_ENV['APP_DEBUG'] ?? 'not loaded');,输出true或false才算成功
多应用模式下域名绑定失败,别碰 config/app.php 的 domain_bind
TP6.1 多应用模式(app_multi = true)下,config/app.php 中的 'domain_bind' 配置完全被忽略。这是旧版单应用的遗留字段,框架启动时压根不读它。
- 正确做法是在
public/index.php入口文件、require __DIR__ . '/../vendor/autoload.php';之后、App::run()之前,手动调用\think\App::bind() - 例如:
if ($_SERVER['HTTP_HOST'] === 'admin.example.com') { \think\App::bind('admin'); } - 绑定后,框架才会加载
app/admin/下的配置、路由、中间件;否则默认走app/目录 - 注意:子域名下的静态资源仍从
public/static/加载,static('css/app.css')不会自动补前缀,需手动拼/static/admin/css/app.css
伪静态(隐藏 index.php)规则必须匹配 Web 服务器类型
TP6.1 默认启用 URL 重写,但 Nginx 和 Apache 的实现机制不同,混用会导致 404。宝塔「URL 重写」选「thinkphp」只生成 Nginx 规则,对 Apache 无效。
- Nginx:确认站点配置中已启用「URL 重写 → thinkphp」,规则本质是把非静态请求转发给
index.php?s= - Apache:确保
public/.htaccess存在且内容含RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L];若仍 404,检查httpd.conf中对应目录的AllowOverride是否为All - 调试技巧:临时在
public/index.php顶部加die($_SERVER['REQUEST_URI']);,看实际进来的 URL 是带index.php还是纯路径,再反推规则是否生效
部署中最容易被跳过的点是:没开 APP_DEBUG=true 就直接上线,结果空白页连错误都看不到;或者 runtime 目录不可写,导致缓存、日志、模板编译全失败——这个目录的权限比 .env 还关键,755 不够,得 775 或 777(视 Web 用户组而定)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










