必须开启url_route_on=true,否则伪静态规则无效;需配合route.php中定义对应路由规则;nginx推荐用try_files而非if判断;多语言路径须严格小写且手动加载。

ThinkPHP伪静态配置必须配合路由开关
不开启 url_route_on,.htaccess 或 Nginx 规则再全也没用——请求压根不会进路由层,直接 404 或跳转到 index.php 原始入口。
确认 config/app.php 中已启用:
-
'url_route_on' => true(TP5/6 均需) -
'pathinfo_depr' => '/'(尤其 TP5,若用下划线分隔需同步改这里) - TP6 默认开启,但若项目从 TP5 升级,
app.php中仍可能残留'url_route_on' => false
常见错误:只配了 .htaccess,却忘了在 route.php 里定义实际路由规则。比如访问 /user/profile,但 route.php 里没写 Route::get('user/profile', 'user.profile'),照样 404。
Nginx 伪静态规则别用 if 判断
if (!-e $request_filename) 在 Nginx 中属于“慢路径”,高并发下性能差,且容易和 fastcgi_pass 冲突导致 502;官方文档也明确建议避免。
改用 try_files 更可靠:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
注意两点:
-
s=$uri是 ThinkPHP 的标准 PATHINFO 入口参数,不能写成s=/$1或漏掉&$args,否则 GET 参数丢失 - 确保
index.php在 public 目录下,且 Nginx root 指向的是public/,不是项目根目录
多语言插件加载失败常因路径大小写不一致
ThinkPHP 多语言包路径是严格区分大小写的:lang/zh-cn/common.php 有效,lang/zh_CN/common.php 或 lang/ZH-CN/common.php 直接被忽略,且不报错。
Linux 服务器上尤其容易踩坑,比如开发时用 Windows 写了 zh_CN,部署后语言切换失效。
插件类语言包(如第三方扩展)不会自动加载,必须手动调用:
- 在
app/common.php或中间件中加:Lang::load('/absolute/path/to/vendor/ext/lang/zh-cn.php'); - 路径必须是绝对路径,相对路径会失败
- 加载顺序要早于任何
lang()调用,否则键值取不到
伪静态 + 多语言混合时 URL 参数易丢失
比如你希望支持 /zh-cn/user/login 和 /en-us/user/login,但用了 try_files $uri $uri/ /index.php?s=$uri&$args 后,zh-cn 被当成了 PATHINFO,Lang::setLang() 取不到语言码。
根本原因是:路由未把语言段识别为变量,框架默认按完整 URL 解析,$uri 是 /zh-cn/user/login,但 Lang::setLang() 没法自动拆。
解决办法只有两个:
- 在
route.php中显式定义带语言前缀的分组:Route::group('zh-cn', function () { Route::get('user/login', 'user.login'); }); - 或在中间件里提前解析:
$lang = explode('/', trim(parse_url($request->url(), PHP_URL_PATH), '/'))[0]; Lang::setLang($lang);,但要注意过滤空值和非法语言码
别指望伪静态规则自己“透传”语言参数——它只负责转发,不负责语义解析。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











