ThinkPHP伪静态怎么配宝塔_ThinkPHP多语言面板设置方法【操作】
宝塔面板配置ThinkPHP6伪静态需将网站运行目录改为/public并重载服务;Nginx重写规则使用官方rewrite规则而非宝塔模板;移除PHP禁用函数中的scandir并确保PATH_INFO正常;多语言包路径必须为lang/zh-cn格式且用PHP数组定义,Lang::setLang()需在中间件中提前执行。最后检查runtime目录权限。
ThinkPHP 6 在宝塔面板上折腾伪静态,多半是栽在这几个坑里:public 目录没指对、scandir 被 PHP 禁了,或者 Nginx 重写规则压根没把请求送进 index.php。至于多语言失效,那更简单——路径大小写、文件名、加载时机,错一个就静默罢工。先聊点具体的。

public 目录:不改就不是 TP6 的玩法
宝塔新建站点时,默认的网站根目录指在项目顶层(比如 /www/wwwroot/myapp),但 ThinkPHP 6 明确只允许 public 子目录对外暴露。不设的话,index.php 直接暴露在根目录不说,config/ 这类敏感目录也能被浏览器直读,路由更是全线崩溃。所以,第一件事:
- 宝塔面板 → 网站 → 对应站点 → 设置 → 网站目录 → 把「运行目录」改成
/public - 改完之后,别只点「保存」。得再点一下「重载 Apache/Nginx」——旧进程还在用老路径,不重载等于白改
- 有人问 TP5 是不是也能这么改?可以,但 TP5 确实能跑在顶层。不过安全性和 URL 一致性都不如指向
public,所以也建议一步到位统一处理
Nginx 伪静态:官方规则最省心,别用宝塔模板
宝塔自带的「ThinkPHP」伪静态模板,默认适配的是 TP5。它对 TP6 的 PATH_INFO 理解不到位,结果就是首页能打开,点个菜单瞬间 404——典型症状。这时候不如直接清空模板,用 TP6 官方规则:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
有几个要点需要注意:
- 别用
try_files写法,比如try_files $uri $uri/ /index.php?$query_string。这会让 TP6 拿不到$_SERVER['PATH_INFO'],直接报URL pathinfo not supported last是灵魂——它让重写后的请求重新匹配 location,确保最终能进入 PHP 处理。换成break或redirect,要么不触发,要么就跳走了- 规则必须放在
location ~ \.php$块之前。如果调换顺序,PHP 文件的匹配优先级更高,rewrite 根本不会被触发
PHP 配置:scandir 和 PATH_INFO 不能动
TP6 启动时,需要扫描 app/、config/ 等目录来加载配置和类,这个过程依赖 scandir()。同时,路由解析依靠 PATH_INFO 相关机制。一旦这俩被禁用或配置不对,结果就是白屏或直接报错。检查步骤:
- 宝塔 → 软件商店 → 找到你用的 PHP 版本 → 设置 → 配置修改 → 搜索
disable_functions - 把
scandir从禁用列表里删掉(其他如exec、system保留即可,不影响安全) - 确认
putenv和ini_set没有被禁用——TP6 运行时需要动态设置PATH_INFO - 检查 PHP-FPM 配置中
fastcgi_param PATH_INFO $fastcgi_path_info;这行是否被注释了。宝塔默认是有这行的,但升级 PHP 版本后有时会被重置,别忘了看一眼
多语言:路径、命名、时机,一个都不能差
TP6 的多语言功能,不是你把配置开关打开就能自动生效的。路径错一位、大小写差一个字母、Lang::setLang() 放错位置,翻译就会静默失效——不报错,只返回原 key,排查起来特别隐蔽。
- 语言包必须放在根目录的
lang/文件夹下,子目录名用小写短横线格式,比如lang/zh-cn/、lang/en-us/。写成zh_CN或ZH-CN都不行,TP6 不会识别 - 每个子目录里放
common.php(也可以用其他分组名,比如user.php),但文件内容必须是return ['hello' => '你好'];这种 PHP 数组格式。不能是 JSON 或 YAML,也不能把定义写在config/lang.php里 Lang::setLang()必须在任何lang()函数调用之前执行。最佳位置是在中间件里(比如app\common\middleware\Lang.php)。放在控制器构造函数里是无效的,调用时机太晚- 调试时,可以在
public/index.php开头加一行$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];强制兜底。但这只是调试手段,上线前必须删掉
最后说一个最容易被忽视的地方:权限。很多人配完所有设置,页面还是不正常,最终发现是 runtime/ 目录的属主不是 www,PHP 没有写入权限,错误信息全被吞了。错误不会直接显示在页面上,但会写在 runtime/log/thinkphp.log 或 Nginx 的错误日志里。所以,配完先去看日志,比反复刷页面有用得多。


































