ThinkPHP 6 在 PHP 7.3 虚拟目录部署必须将 Web 服务器 DocumentRoot(Apache)或 root(Nginx)指向 public/ 目录,确保敏感文件不被直接访问、路由正常解析,同时启用 fileinfo、mbstring 等必需扩展并正确配置 runtime 权限与 .env 加载路径。

PHP 7.3 虚拟目录部署 ThinkPHP 项目,核心问题是:不能直接把整个项目扔进虚拟目录根路径,否则 public/ 外的敏感目录(app/、config/、.env)会被 Web 直接访问,且所有路由 404。必须让 Web 服务器只认 public/ 为真实 DocumentRoot,其余结构保持原样。
Apache 虚拟主机里 root 必须指向 public/
在 Apache 的 vhost.conf 或 httpd-vhosts.conf 中,DocumentRoot 和对应的 <Directory> 路径都得明确写到 public/ 子目录,不是项目根目录:
DocumentRoot "/www/wwwroot/myapp/public"
<Directory "/www/wwwroot/myapp/public">
AllowOverride All
Require all granted
</Directory>
常见错误是只改了 DocumentRoot 却漏掉 <Directory>,导致 403 Forbidden;或者两个都指向项目根(如 /myapp),结果 config/database.php 可被浏览器直接下载。
确保 .htaccess 文件存在于 public/ 下,内容为 TP6 标准规则:
立即学习“PHP免费学习笔记(深入)”;
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]
</IfModule>
-
mod_rewrite必须启用(宝塔面板里 PHP 设置 → Apache 模块 → 勾选) - 如果用的是 phpStudy(小皮),记得在站点管理 → 高级配置 → 开启「伪静态」并选择「ThinkPHP」模板——但注意:该模板默认适配 TP5,TP6 需手动替换为上面这段内容
- 修改后必须重启 Apache,仅重载不生效
Nginx 虚拟主机中 root 和 fastcgi_param 都要对齐 public/
Nginx 不像 Apache 有 .htaccess,所有逻辑靠配置驱动。关键点有两个:root 指向 public/,且 fastcgi_param SCRIPT_FILENAME 必须拼出完整物理路径:
server {
listen 80;
server_name example.com;
root /www/wwwroot/myapp/public;
index index.php;
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
最容易错的是这一行:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name。如果 root 指向项目根(/myapp),而 $document_root 就是那个路径,那么 PHP 实际执行的会是 /myapp/index.php —— 这个文件根本不存在,报错 No input file specified。
- 别用
try_files $uri $uri/ /index.php?$query_string,TP6 不识别这种 PATH_INFO 传参方式 - 宝塔用户:进网站 → 设置 → 网站目录 → 运行目录选
/public,再进「伪静态」→ 清空原有内容 → 粘贴上面location / { ... }块 → 保存后务必点【重载配置】+【重启 Nginx】 - PHP-FPM 用户需确认
listen地址与fastcgi_pass一致(127.0.0.1:9000或 socket 路径)
PHP 7.3 扩展缺一不可,尤其 fileinfo 和 mbstring
PHP 7.3 本身支持 TP6,但若扩展没开全,会在启动时直接报错或运行中崩溃。以下扩展必须启用:
-
fileinfo:框架自动检测上传文件类型,缺失则Request::file()报错 -
mbstring:中文 URL 解析、字符串截取依赖它,没启用会导致路由匹配失败或乱码 -
pdo_mysql:连 MySQL 必需,否则数据库操作全挂 -
openssl和curl:微信支付、OAuth 登录等 SDK 必用 -
json、ctype、session:基础功能支撑,缺一个都可能让Env加载失败或 Session 写入异常
验证方式:创建一个 phpinfo.php 放在 public/ 下,访问看对应模块是否显示「enabled」;或终端执行 php -m | grep -E "fileinfo|mbstring|pdo"。
宝塔用户:软件商店 → 找到 PHP 7.3 → 设置 → 安装扩展 → 全部勾选 → 【安装】→ 【重启 PHP 服务】(只重载不生效)。
runtime 目录权限和 .env 加载时机常被忽略
即使 Web 服务和 PHP 都配对了,仍可能白屏或 500,原因往往在这两处:
-
runtime/目录必须可写:ThinkPHP 默认在此生成缓存、日志、模板编译文件。Linux 下执行chmod -R 755 runtime;Windows 下检查文件夹属性 → 安全 → IIS_IUSRS 或 Apache 用户是否有「修改」权限 -
.env在根目录(/myapp/.env),但只有当 Web 服务器的 DocumentRoot 是/myapp/public时,框架才能正确向上一级读取它。如果 DocumentRoot 错设为/myapp,.env会被当成普通文件暴露,且框架实际加载的是public/.env(不存在) -
APP_DEBUG=true必须取消注释,否则生产环境默认关闭调试,出错只返回空白页或 500,看不到具体报错信息
最稳妥验证方式:访问 http://your-domain.com/public/index.php(带 public/ 和 index.php),能显示 ThinkPHP 默认首页,说明入口通了;再去掉 index.php 测试伪静态是否生效。前者不通,一定是路径或扩展问题;后者不通,重点查 rewrite 规则和 SCRIPT_FILENAME 拼接。



















