ThinkPHP5路由需在config/app.php中开启'url_route_on'=>true且合理设置'url_route_must',用Route::get/post等注册,区分动态参数[:id]与:id,结尾加$实现完整匹配,并上线前执行php think optimize:route生成缓存。

ThinkPHP5 路由不是“开了就能用”,必须明确开启、正确注册、合理组织,否则访问 404 或原 URL 失效是常态。
路由开关和模式必须先配对
只改 route.php 不起作用——核心配置在 config/app.php 里。关键两项缺一不可:
-
'url_route_on' => true:必须为true,否则所有Route::*注册都无效 -
'url_route_must' => false(推荐初学设为false):设为true后,没定义路由的地址一律 404,连首页都会挂掉
常见错误:开了 url_route_on 却没关 url_route_must,结果访问 /index/index/index 直接报错,误以为路由本身坏了。
注册路由必须用 Route::get / Route::post 等方法,别硬套 rule
Route::rule() 是万能接口,但参数多、易错,新手容易漏写请求类型或传错数组结构。实际开发中应优先用快捷方法:
立即学习“PHP免费学习笔记(深入)”;
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- GET 请求:用
Route::get('hello/:name', 'index/hello'),不用写第三个参数'GET' - POST 请求:用
Route::post('login', 'user/login'),避免手写'POST'大小写错误 - 同时支持 GET 和 POST:直接写两个语句,比拼字符串
'GET|POST'更清晰、更不易出错
注意:Route::any() 看似方便,但在生产环境会掩盖请求类型意图,调试时难定位问题,不建议默认使用。
动态参数和可选参数写法必须严格区分
ThinkPHP5 对参数是否必填极其敏感,[:name] 和 :name 表现完全不同:
-
'user/:id'→ 必须带/user/123,访问/user直接 404 -
'user/[:id]'→/user和/user/123都匹配,控制器里需给$id设默认值(如input('id', 'default')) - 多个参数时不能混用:例如
'blog/:year/:month/[:day]'合法,但'blog/:year/[:month]/:day'会破坏匹配顺序,导致/blog/2026/5匹配失败
另外,完整匹配要用 $ 结尾:'api/status$' 只匹配 /api/status,不匹配 /api/status/ 或 /api/status/extra —— 这个符号容易被忽略,却直接影响 API 兼容性。
路由缓存不是可选项,而是上线前必跑命令
开发阶段可以不缓存,但部署后不执行缓存命令,每次请求都要重新解析全部路由规则,性能明显下降:
- 生成缓存:运行
php think optimize:route,生成runtime/route.php - 缓存生效前提:确保
runtime目录可写,且没有手动删过该文件 - 修改路由后必须重生成:改了
route.php却忘了跑命令,新路由永远不生效
最常被忽略的一点:闭包路由(比如 Route::get('/', function(){...}))无法被缓存,一旦用了闭包,整个路由缓存就退化为无效——需要权衡简洁性和性能。


















