thinkphp6在nginx子站点部署需显式保留路径前缀,正确配置location /myapp/块并重写至/myapp/public/index.php?s=$1,确保fastcgi_split_path_info与path_info传递,并将运行目录设为/myapp/public。

ThinkPHP6 在 Nginx 下部署子站点(如 https://example.com/myapp/)时,伪静态配置不能直接套用根目录规则——路径前缀被截断会导致 s= 参数丢失、PATH_INFO 解析失败、路由 404 或白屏。关键在于显式保留子目录层级,并与项目结构、Nginx 变量、PHP 运行环境三者对齐。
子目录入口路径必须带 /public/
TP6 入口强制在 public/index.php,而子站点 URL 是 /myapp/,所以真实可访问的入口是 /myapp/public/index.php。Nginx 规则中重写目标必须完整写出该路径:
- 错误写法:
rewrite ^/myapp/(.*)$ /index.php?s=$1 last;(找不到/index.php,404) - 正确写法:
rewrite ^/myapp/(.*)$ /myapp/public/index.php?s=$1 last; - 若站点 root 设为
/www/wwwroot/example.com,则/myapp/public/对应物理路径/www/wwwroot/example.com/myapp/public/
location 块需独立声明且位置精准
不能把子目录规则塞进主 location / { },必须新建一个专用于子路径的 location 块,并放在 location ~ \.php$ 之前:
- 添加如下配置到
server块内:
if (!-e $request_filename) {
rewrite ^/myapp/(.*)$ /myapp/public/index.php?s=$1 last;
}
}
-
last不可替换为break或redirect:只有last会触发重匹配,让请求进入 PHP 处理块 - 该块必须在
location ~ \.php$之前,否则 .php 文件优先匹配,if不执行
PHP 处理块要支持子路径 PATH_INFO
即使 rewrite 成功,TP6 启动时仍需正确提取 PATH_INFO。以下三项缺一不可:
- 在
location ~ \.php$块中确认存在:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info; - PHP 禁用函数中不能勾选
putenv和ini_set(TP6 依赖它们动态设置环境变量) - 宝塔后台 → 网站 → 设置 → 网站目录 → 运行目录:必须设为
/myapp/public(不是/,也不是留空)
避免常见陷阱
子站点配置失败,90% 源于这些细节疏漏:
-
root 指令写在 location 内:会导致
$realpath_root解析异常,务必只在server级定义root -
混淆 public 目录层级:项目结构应为
/myapp/是子目录名,其下有public/,不是/myapp/public/public/ -
忽略大小写或斜杠结尾:浏览器访问
/myapp(无尾部斜杠)可能不匹配location /myapp/,建议统一加斜杠或额外加一条location /myapp { return 301 /myapp/; }
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











