ThinkPHP二级目录部署必须用独立location /myapp/块承接请求,不可在根location /内rewrite;需匹配入口路径、正确传递s=参数或$query_string,并同步配置root指向、PHP fastcgi_param及框架路由开关。

ThinkPHP部署在二级目录(比如 https://example.com/myapp/)时,Nginx伪静态不能直接套用根目录规则,否则路由参数 s= 会截断或丢失,导致所有子路径 404 或白屏。关键在于:请求路径前缀必须被识别并保留,入口文件位置要匹配,PATH_INFO 或 QUERY_STRING 必须正确传递。
必须用独立 location 块承接二级目录
不能在 location / 里写 rewrite ^/myapp/(.*)$——Nginx 不会自动把该 rewrite 映射到物理子目录,必须显式声明目录级 location:
- 在站点配置的
server { }块内,新增一个专用于二级目录的块,例如:
if (!-e $request_filename) {
rewrite ^/myapp/(.*)$ /myapp/index.php?s=$1 last;
}
}
-
/myapp/末尾斜杠不可省略,否则/myapp(无尾斜杠)请求不匹配 - 该块必须与
location /并列存在,不能嵌套 - 若入口文件实际在
/myapp/public/index.php,则需把root指向/myapp/public,并改写为:
rewrite ^/myapp/(.*)$ /index.php?s=$1 last;
配套 root 和 PHP 处理配置要对齐
仅改 location 不够,三项必须同步:
-
root 指令指向正确物理路径:若项目结构是
/www/wwwroot/example.com/myapp/,且index.php在myapp/下,则root /www/wwwroot/example.com;;若入口在myapp/public/,则root /www/wwwroot/example.com/myapp/public; -
PHP 处理块启用 PATH_INFO 支持:在
location ~ \.php$内确保含这两行:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info; -
禁用影响 PATH_INFO 的 PHP 函数:在宝塔或 phpStudy 的 PHP 设置中,从「禁用函数」列表移除
putenv和ini_set
更稳的 try_files 替代方案(推荐 PHP 8.4+ 环境)
if 判断在 Windows 或高并发下有 PATH_INFO 清空风险,可改用 try_files(需配合 $realpath_root):
- 保留主
location /,但修改 fallback 路径:
location / {
try_files $uri $uri/ /myapp/index.php?$query_string;
} - 同时确认 PHP 块中含:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - 此方式不依赖 if,路由参数走 QUERY_STRING,解析更稳定,尤其适合 TP6/TP8
框架层配置不能漏
Nginx 转发过去后,ThinkPHP 自身也得配合:
-
config/app.php中:
url_route_on ⇒true
url_html_suffix ⇒''(空字符串,不是null或html)
pathinfo_depr ⇒'/' - 若使用 .env,确认
APP_ENV=production且未设APP_DEBUG=false导致路由被静默关闭 - 访问
https://example.com/myapp/index.php?m=index&a=test能响应,再测/myapp/index/test—— 前者通说明入口正常,后者通才代表伪静态生效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











