ThinkPHP路由与伪静态需前后协同:Nginx用try_files将请求交至index.php,框架通过url_route_on开启路由、pathinfo_depr设分隔符,并用Route::group等定义前后台路由规则,缺一不可。

ThinkPHP 的路由定义和伪静态规则是“前后协同”的关系:服务器负责把请求转给框架,框架负责把路径映射到控制器方法。两者缺一不可,配合好了才能实现干净的 URL(比如 /article/123 而不是 /index.php?s=/article/123)。
一、先让服务器把请求正确交给 index.php
伪静态规则本质是“URL 重写”,目的是隐藏 index.php 并把所有非静态资源请求统一交给框架处理。
Nginx 推荐写法(部署在根目录):
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}- ✅
$uri保留原始路径(如/admin/user),供 TP 解析 PATH_INFO - ✅
&$args确保 GET 参数不丢失(如?page=2&sort=id) - ❌ 不要用
if (!-e $request_filename)套路,易出逻辑漏洞
Apache .htaccess 写法(public 目录下):
立即学习“PHP免费学习笔记(深入)”;
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]- ✅
PT(PassThrough)确保路径能被 PHP 正确识别为 PATH_INFO - ✅
QSA保留查询参数
⚠️ 前提:Nginx 的
root必须指向public/目录;Apache 的DocumentRoot同理。
二、框架内开启并匹配路由机制
光有服务器转发还不够,TP 必须知道怎么拆解这个路径。
关键配置项(config/app.php):
'url_route_on' => true, // 必须开启路由 'pathinfo_depr' => '/', // PATH_INFO 分隔符,和 URL 一致 'url_html_suffix' => 'html', // 可选:加 .html 后缀(如 /article/123.html) 'url_param_type' => 0, // 0=PATH_INFO 模式(推荐),1=QUERY_STRING 模式
✅ ThinkPHP 5.1+ 默认用 PATH_INFO 模式,所以服务器传来的
$uri就是路由原始字符串,TP 会按/切分后匹配规则。
Skill Weave Chains — 技能链路由引擎下载开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
三、路由定义要覆盖实际访问路径
伪静态后的 URL 是什么样子,路由规则就得按那个样子写。
举例:你想访问 /news/2026/10/27 → 映射到 NewsController::detail()
✅ 正确写法(TP 6.x / 5.1):
use think\facade\Route;
Route::get('news/<year>/<month>/<day>', 'News/detail');-
<year></year>是变量,自动绑定到方法参数public function detail($year, $month, $day)
✅ 带模块前缀的后台路由(如 /admin/user/list):
Route::group('admin', function () {
Route::get('user/list', 'admin/User/list');
})->prefix('admin/');- 访问
/admin/user/list才会命中,不会和前台/user/list冲突
❌ 错误写法(漏掉前缀或没分组):
Route::get('user/list', 'admin/User/list'); // 可能被前台路由抢走四、验证是否真正生效
别只看 URL 是否“没 index.php”,还要确认三点:
- 浏览器地址栏显示
/article/123,且页面正常加载 - 查看网络请求,状态码是 200,不是 301 或 404
- 在控制器里
dump(request()->url()),输出应为/article/123(不是/index.php/article/123)
如果仍跳转或报错,优先检查:
- Nginx 的
root是否指向public/(不是项目根目录) -
pathinfo_depr是否和 URL 中的分隔符一致(比如用了下划线_,但 URL 是/) - 路由规则是否拼写错误,或被更宽泛的规则提前匹配
不复杂但容易忽略



















