TP8路由生效需四者同步对齐:配置位置(app/route/app.php或子应用对应路径)、app_route开关显式启用、执行route:clear清除缓存、注解路由需独立安装并初始化;伪静态须配合Nginx root指向子应用public目录及完整fastcgi参数。

TP8 路由规则不是“改写法就行”,而是配置位置、开关状态、缓存机制、多应用上下文四者必须同步对齐;漏掉任一环节,php think route:list 看不到路由,访问直接 404。
route/app.php 文件位置写错
TP8 的路由定义不再接受 config/route.php 或根目录下任意 route.php;所有具体路由规则必须落在对应应用的 app/route/app.php(单应用)或 app/admin/route/app.php(多应用子应用)中。
- 若项目是多应用结构(如含
app/admin),却把/admin/login路由写在主应用的app/route/app.php,框架根本不会加载它——admin请求压根没进这个文件 - 文件开头必须有
use think\facade\Route;,否则Route::get()等调用会报类未找到 - 若误将规则写入
config/route.php,需全部剪切、清空该文件,并执行php think route:clear
app_route 开关未显式启用
TP8 默认关闭路由解析,即使路由文件存在且语法正确,app_route => true 缺失时,请求会退化为传统「模块/控制器/操作」硬路径匹配,/hello 永远找不到 index/hello。
- 检查
config/app.php(主应用)和app/admin/config/app.php(子应用)中是否都有'app_route' => true,值必须是布尔true,不能是字符串"true"或数字1 - 多应用下,子应用的
app_route不继承主应用配置,每个子应用都要单独配 - 修改后必须运行
php think route:clear,否则旧缓存仍生效
注解路由静默失效
注解路由(#[Get]、#[Route])在 TP8 中是独立扩展,默认不激活,不报错也不提示,只会在 php think route:list 中彻底消失。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
立即学习“PHP免费学习笔记(深入)”;
- 确认已执行
composer require topthink/think-annotation - 在
app/bootstrap.php或自定义服务提供者中调用AnnotationRoute::init() - 检查
config/annotation.php中'route' => ['enable' => true]是否为true - 多应用下,
config/annotation.php的'controllers'必须显式列出所有应用控制器命名空间,例如:['app\controller', 'app\admin\controller'],路径用双反斜杠 -
#[Get]不支持middleware、domain、pattern,要用这些功能必须改用#[Route]
伪静态与多应用上下文错位
伪静态本身没问题,但 TP8 多应用模式下,/admin/login 能否被识别为 admin 应用,取决于 Nginx/Apache 是否把请求完整交到 app/admin/public/index.php —— 而不是主应用的入口。
- Nginx 的
root必须指向子应用的public目录(如/path/to/project/app/admin/public),不是项目根目录 -
try_files $uri $uri/ /index.php?$query_string;中的/index.php是相对root的,所以root设对了,才真正命中子应用入口 -
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;这一行不能少,且依赖$document_root由前面的root正确赋值 - 若用
domain_bind,键名必须和浏览器地址栏完全一致(www.example.com≠example.com,localhost:8000必须带端口)
最常被忽略的是:多应用伪静态不是改一条 rewrite 就完事,root、try_files、fastcgi_param 三者缺一不可,且必须针对每个子应用单独配一套——共用同一份 Nginx 配置,只是改 server_name 和 root,是最稳妥的做法。


















