ThinkPHP 6+部署时运行目录必须设为public目录,因其采用前端控制器模式,所有请求须经public/index.php统一入口处理;否则将导致敏感文件暴露、路由404、静态资源加载失败及autoload.php无法加载。

因为 ThinkPHP 6+ 采用前端控制器(Front Controller)架构,所有 HTTP 请求必须经过 public/index.php 统一入口处理,这是框架启动、路由分发、自动加载和安全隔离的基础机制。
防止敏感文件被直接访问
项目中 app/、config/、route/、.env 等目录包含应用逻辑、数据库配置甚至密钥。如果 Web 根目录指向项目根(如 /var/www/myapp),这些路径就可能被浏览器直接请求并返回源码,造成严重信息泄露。而 public/ 是唯一设计为“可公开”的目录,内部已通过 Nginx location 规则或 Apache .htaccess 明确屏蔽了对敏感路径的访问。
确保框架能正常启动和加载
ThinkPHP 启动时依赖 public/index.php 中定义的常量(如 APP_PATH、RUNTIME_PATH)和路径推导逻辑。若 Web 服务器不从 public/ 开始解析,会导致:
-
vendor/autoload.php找不到,报Class 'think\App' not found - 配置文件无法载入,
config/目录路径错乱 -
runtime/目录写入失败,缓存、日志、模板编译全部异常 - 上传路径、资源路径(如
asset()生成的 URL)全部错位
保障静态资源正确加载
CSS、JS、图片等静态文件默认放在 public/static/、public/uploads/ 等子目录下。浏览器请求 /static/css/app.css 时,Web 服务器必须能从 public/ 开始映射到对应物理路径。如果 root 指向项目根,请求会落到 /static/css/app.css(不存在),而非真实的 public/static/css/app.css,结果就是大量 404。
立即学习“PHP免费学习笔记(深入)”;
适配标准部署与容器化环境
无论是 Nginx/Apache 虚拟主机、Docker 多阶段构建,还是云平台 PaaS 部署,官方实践都强制要求将 Web 服务的 document_root 设为 public。例如:
- Nginx 配置中
root /path/to/project/public;(注意结尾无斜杠) - Apache 的
DocumentRoot必须是"C:/wamp64/www/myapp/public" - Docker 镜像中 Nginx 的
root必须指向容器内/var/www/html/public
偏离这一约定,轻则功能异常,重则引发安全事件,不是可选项,而是强制前提。



















