ThinkPHP二级目录伪静态失效的核心原因是服务器未透传子目录路径,导致$_SERVER['SCRIPT_NAME']与实际路径错位;需同步调整重写规则、物理路径指向及PATH_INFO传递,并确认.htaccess位置、RewriteBase(Apache)或location匹配(Nginx)、框架入口与运行目录配置。

ThinkPHP部署在二级目录时,伪静态失效或404,核心问题不是规则写错了,而是服务器没把子目录路径正确透传给PHP,导致$_SERVER['SCRIPT_NAME']和$_SERVER['REQUEST_URI']错位,框架路由无法识别真实入口位置。必须同时调整服务器重写逻辑、物理路径指向和PATH_INFO传递三处。
Apache下二级目录伪静态配置要点
关键在.htaccess文件位置和RewriteBase设置:
-
文件放对位置:.htaccess必须放在
public/目录下(即index.php所在目录),不是项目根目录 -
必须声明RewriteBase:比如网站访问地址是
https://example.com/myapp/,则在.htaccess开头加:RewriteBase /myapp/ -
完整规则示例(适用于TP6/TP5):
RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
Nginx下二级目录伪静态配置要点
不能套用根目录规则,必须显式匹配子路径并修正脚本路径:
-
location块要精准匹配子目录:例如部署在
/myapp/,就写location /myapp/ { },不能只写location / { } -
重写目标要带子目录前缀:规则应为
rewrite ^/myapp/(.*)$ /myapp/public/index.php?s=$1 last; -
fastcgi_param必须补全:在fastcgi配置段中确保包含这两行:
fastcgi_param SCRIPT_FILENAME $document_root/myapp/public/index.php;<br>fastcgi_param PATH_INFO $fastcgi_path_info;
ThinkPHP框架侧必须检查项
服务器配置只是前提,框架本身也要适配子目录环境:
立即学习“PHP免费学习笔记(深入)”;
-
入口文件路径确认:TP6默认入口是
public/index.php,Nginx的root指令要指向项目根目录,而非public目录 -
运行目录设对:宝塔用户需在「网站设置 → 网站目录」中将“运行目录”设为
/public,否则子目录下仍会找错路径 -
调试时关掉APP_DEBUG:开启调试模式会掩盖真实路由解析过程;建议用命令行执行
php think route:list查看注册的路由是否已自动带上/myapp/前缀
快速验证是否生效
别只看保存按钮,实测才可靠:
- 访问
https://yourdomain.com/myapp/index/test(不带index.php)能正常输出 → 配置成功 - 返回404 → 检查Nginx location是否匹配
/myapp/,或Apache RewriteBase是否漏写 - 提示“URL pathinfo not supported” → PHP禁用了
putenv或ini_set,或fastcgi_param PATH_INFO未设置



















