商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > ThinkPHP伪静态怎么配宝塔_ThinkPHP多语言面板设置方法【操作】

ThinkPHP伪静态怎么配宝塔_ThinkPHP多语言面板设置方法【操作】

  发布于2026-07-09 阅读(0)

扫一扫,手机访问

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

ThinkPHP伪静态怎么配宝塔_ThinkPHP多语言面板设置方法【操作】

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 处理。换成 breakredirect,要么不触发,要么就跳走了
  • 规则必须放在 location ~ \.php$ 块之前。如果调换顺序,PHP 文件的匹配优先级更高,rewrite 根本不会被触发

PHP 配置:scandir 和 PATH_INFO 不能动

TP6 启动时,需要扫描 app/config/ 等目录来加载配置和类,这个过程依赖 scandir()。同时,路由解析依靠 PATH_INFO 相关机制。一旦这俩被禁用或配置不对,结果就是白屏或直接报错。检查步骤:

  • 宝塔 → 软件商店 → 找到你用的 PHP 版本 → 设置 → 配置修改 → 搜索 disable_functions
  • scandir 从禁用列表里删掉(其他如 execsystem 保留即可,不影响安全)
  • 确认 putenvini_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_CNZH-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 的错误日志里。所以,配完先去看日志,比反复刷页面有用得多。

本文转载于:https://www.php.cn/faq/2412776.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注