发布于2026-07-09 阅读(0)
扫一扫,手机访问
ThinkPHP 6 在宝塔面板上折腾伪静态,多半是栽在这几个坑里:public 目录没指对、scandir 被 PHP 禁了,或者 Nginx 重写规则压根没把请求送进 index.php。至于多语言失效,那更简单——路径大小写、文件名、加载时机,错一个就静默罢工。先聊点具体的。

宝塔新建站点时,默认的网站根目录指在项目顶层(比如 /www/wwwroot/myapp),但 ThinkPHP 6 明确只允许 public 子目录对外暴露。不设的话,index.php 直接暴露在根目录不说,config/ 这类敏感目录也能被浏览器直读,路由更是全线崩溃。所以,第一件事:
/publicpublic,所以也建议一步到位统一处理宝塔自带的「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 supportedlast 是灵魂——它让重写后的请求重新匹配 location,确保最终能进入 PHP 处理。换成 break 或 redirect,要么不触发,要么就跳走了location ~ \.php$ 块之前。如果调换顺序,PHP 文件的匹配优先级更高,rewrite 根本不会被触发TP6 启动时,需要扫描 app/、config/ 等目录来加载配置和类,这个过程依赖 scandir()。同时,路由解析依靠 PATH_INFO 相关机制。一旦这俩被禁用或配置不对,结果就是白屏或直接报错。检查步骤:
disable_functionsscandir 从禁用列表里删掉(其他如 exec、system 保留即可,不影响安全)putenv 和 ini_set 没有被禁用——TP6 运行时需要动态设置 PATH_INFOfastcgi_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 的错误日志里。所以,配完先去看日志,比反复刷页面有用得多。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8