结论:小皮面板给 ThinkPHP 写伪静态,分两步——先把网站「运行目录」改成 public(TP5/TP6 的入口文件在这里),再到「网站 → 管理 → 伪静态」里按 Nginx 或 Apache 粘贴对应规则。顺序反了,规则写得再对也不生效。
小皮面板写 ThinkPHP 伪静态,第一步为什么是改运行目录?
因为 ThinkPHP 5.x/6.x 的唯一入口文件是 public/index.php,不是项目根目录的 index.php,运行目录不指过去,index.php 这个 rewrite 目标就找不到。
操作路径:小皮面板 → 网站 → 找到你的站点 → 管理 → 网站目录 → 「运行目录」下拉选 /public → 保存。
如果你本地绑定的是 www.gj0.com 这类域名做测试,改完运行目录后先刷新一次首页,能正常打开再继续下面的规则配置。TP3.2 是例外,它的入口文件在项目根目录,运行目录保持默认即可。
Nginx 版 ThinkPHP 伪静态规则怎么写?
小皮面板 Nginx 的伪静态写在「网站 → 管理 → 伪静态」面板里,它最终会插入到站点的 server 块中,所以填的是 location 片段,不是 .htaccess。
TP5.1 / TP6 通用写法:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
也可以用更简洁的 try_files:
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
TP3.2 因为走的是 pathinfo 形式,把 rewrite 目标换成 /index.php/$1:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php/$1 last;
}
}
保存后重启一次 Nginx(小皮面板首页有「重启」按钮),再访问 /index.php/模块/控制器/方法 之外的伪静态地址验证。
Apache 版 ThinkPHP 伪静态规则怎么写?
小皮面板 Apache 的伪静态同样是「网站 → 管理 → 伪静态」,选 thinkphp 内置模板或自定义,也可以直接写文件放到站点运行目录下的 .htaccess。
TP5.1 / TP6 规则:
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
</IfModule>
TP3.2 规则:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
注意两点:一是 Apache 必须加载 rewrite_module;二是站点配置里要让目录支持 .htaccess,即 AllowOverride All。小皮面板默认通常已开启,如果 .htaccess 被忽略,去「设置 → 配置文件」里确认这两项。
伪静态配好了还是 404,怎么排查?
按下面这个顺序查,基本 5 分钟内能定位:
- 运行目录是不是
/public,这是最高频的原因;
- 伪静态是填在站点面板里还是只写了
.htaccess,Nginx 完全不读 .htaccess,写错地方等于没写;
- ThinkPHP 的
config/route.php 里 url_rewrite 之类的路由开关是否按版本配置到位;
- 改完规则有没有重启 Nginx / Apache,不重启不生效;
- 浏览器和框架缓存:清掉
runtime 目录再试一次。
一句话总结:小皮面板下 ThinkPHP 伪静态 = 运行目录指向 public + 面板内粘贴对应版本的 location / .htaccess 规则 + 重启服务。TP5.1 和 TP6 用 index.php?s=$1 或 try_files,TP3.2 用 index.php/$1,两者别混用。