TP8.0已彻底移除TP5.1的s=/$1伪静态路由机制,不再支持自动解析s=参数映射控制器/方法,所有路由必须显式定义,如Route::get()或#[Route]注解,此举既为范式升级,也为安全加固。

不能用了。
TP5.1 中的 s=/$1 是基于 URL 模式匹配的「伪静态路由参数写法」,依赖 url_route_must 和 url_param_type=1 等旧机制,配合 __URL__ 解析和 dispatch 层对 $1 的正则捕获。这套逻辑在 TP8.0 中已被完全移除——底层不再支持 s= 参数驱动的自动控制器/方法映射,也不再解析 /index.php?s=/admin/index 这类请求路径。
原因很直接:
- TP8.0 彻底废弃了「自动路由(auto_route)」和「变量路由(如 s=)」机制;
- 所有路由必须显式定义,要么用闭包 + 命名空间控制器,要么用注解
#[Route]或Route::get()等标准方式; - 请求入口统一走
think\Request,不再从$_GET['s']提取并解析路径字符串。
如果你现在访问 /index.php?s=/admin/index,TP8.0 会:
立即学习“PHP免费学习笔记(深入)”;
- 忽略
s=参数(除非你手动在中间件或控制器里读取并处理); - 默认尝试匹配
/index.php这个路径,大概率返回 404; - 不会自动调用
app\admin\controller\Index::index()。
要实现类似效果,得重写为明确路由规则:
// route/app.php
use think\facade\Route;
use app\admin\controller\Index;
Route::get('admin', [Index::class, 'index']);
Route::get('admin/:id', [Index::class, 'read'])->where('id', '\d+');或者用注解(需启用 think-annotation):
// app/admin/controller/Index.php
<?php
namespace app\admin\controller;
use think\annotation\Route;
class Index
{
#[Route('admin')]
public function index()
{
return 'admin index';
}
}另外注意:
-
s=曾是 TP5.x RCE 漏洞高发入口(如s=/index/\think\app/invokefunction),TP8.0 主动移除也是出于安全加固; - 升级后若前端仍拼接
s=请求,必须同步改造前端链接或加一层兼容中间件(不推荐,应彻底切换)。
本质上,这不是“语法不支持”,而是设计范式变了——从「隐式路径解析」转向「显式路由声明」。



















