必须是public目录,因thinkphp 6+采用前端控制器模式,所有请求须经public/index.php统一入口处理;若指向项目根目录,将导致敏感文件暴露、路由404、静态资源加载失败及autoload.php无法加载。

ThinkPHP部署时,运行目录必须设为public/子目录,这是安全与功能正常的基础前提。设错会导致配置文件暴露、路由404、静态资源加载失败、vendor/autoload.php找不到等一系列连锁问题。
为什么必须是 public 目录?
ThinkPHP 6+ 采用前端控制器模式,所有请求都需经 `public/index.php` 统一入口处理。若 Web 服务器根目录指向项目根(如 `/var/www/myapp`),则: - `app/`、`config/`、`route/` 等敏感目录可被直接访问,存在源码泄露风险 - `index.php` 不在 Web 可执行路径下,框架无法启动 - `ROOT_PATH` 和 `APP_PATH` 推导错误,导致 runtime 写入失败、上传路径错乱简单说:不是“可以设”,而是“必须设”——否则整个框架无法进入正常工作流。
不同环境下的设置方式
宝塔面板(最常见场景) 进入「网站 → 设置 → 网站目录」→ 将「运行目录」下拉选择 `/public`(注意不是手动输入 `/public/`,也不是留空)→ 点击「重载 Nginx/Apache」并确认服务已重启。Nginx 手动配置
在站点配置的 server 块中,将 root 指向 public 的绝对路径:
root /var/www/myapp/public;同时确保 PHP 处理块中 `SCRIPT_FILENAME` 正确拼接:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Apache 虚拟主机
在 <virtualhost></virtualhost> 中明确指定:
DocumentRoot "/var/www/myapp/public"并在对应 `
AllowOverride All
设对之后还要检查什么?
- ✅ 删除 `runtime/` 目录,让框架重建缓存(路径依赖重置后旧缓存会失效) - ✅ 确认 `public/index.php` 开头已执行 `chdir(dirname(__DIR__));`,强制工作目录为项目根(避免命令行或子目录部署时路径偏移) - ✅ 检查 PHP `disable_functions` 是否禁用了 `scandir`——TP6 启动时大量调用该函数扫描目录,禁用会导致白屏或报错 - ✅ 运行 `php think optimize:config` 生成配置缓存,验证 `vendor/autoload.php` 是否能正常加载常见误区提醒
- 宝塔伪静态不能用默认「ThinkPHP」模板,那是为 TP5 设计的;必须粘贴 TP6 专用规则(`if(!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }`) - `.htaccess` 或 Nginx 的 `try_files` 规则中写 `/index.php`,不是 `/public/index.php`——因为根目录已是 `public`,当前上下文就是它 - 多应用或子目录部署时,仅设对运行目录还不够,还需配合 `APP_BASE_PATH` 常量或 `$_SERVER['SCRIPT_NAME']` 手动修正 URL 基础路径不复杂但容易忽略。设对 public 是起点,后续所有路径、路由、缓存才真正有据可依。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











