不加 pattern() 的路由变量默认只匹配字母、数字、下划线和短横线,中文、点号、斜杠等会导致404;{id} 类占位符若未用 pattern() 限定为 \d+,易引发类型转换错误或 SQL 注入;pattern() 必须显式声明且键名与占位符完全一致,正则仅支持规则片段(如 \d+),不支持 ^$ 等锚点;中文需用 \x{4e00}-\x{9fa5} 并加 u 修饰;. * 应慎用;pattern() 不作用于查询参数和模糊占位符;约束失败直接 404,需用 php think route:list 验证。

不加 pattern() 的路由变量默认只认字母、数字、下划线和短横线,遇到中文、点号、斜杠、空格直接 404;更危险的是,{id} 这种写法默认会接受 123abc,控制器里一转整型就崩,还可能被 SQL 注入。
pattern() 必须显式声明,且 key 和占位符名要完全一致
ThinkPHP 不会根据占位符名字自动推断规则,{uid} 和 {pid} 必须在 pattern() 数组里用相同名字声明,否则约束无效:
-
Route::get('user/{uid}/{pid}', 'user/info')->pattern(['uid' => '\d+', 'pid' => '\d+'])✅ -
->pattern(['id' => '\d+'])❌ ——{uid}和{pid}都不受控 -
{token}就得写['token' => '[a-zA-Z0-9_]{16,32}'],不能简写成['key' => ...]
正则写法有硬限制,不是 PCRE 原样照搬
ThinkPHP 的 pattern() 只接收纯规则片段,不支持锚点、分组、完整正则字符串:
- ✅ 正确:
->pattern(['id' => '\d+'])或内联写法'user/{id:\d+}' - ❌ 错误:
->pattern(['id' => '^\d+$'])(^和$被忽略或报错) - ❌ 错误:
Route::rule('^user/(\d+)$', 'user/info')(会被当静态路由,\d+不起作用)
中文、斜杠等特殊字符必须配 u 修饰语义和明确 pattern
默认规则不支持中文、点号、URL 中的斜杠。要支持,必须显式定义,且带 u 模式(UTF-8 语义):
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即学习“PHP免费学习笔记(深入)”;
- 中文标题:
->pattern(['title' => '[\x{4e00}-\x{9fa5}a-zA-Z0-9_-]+']) - 带斜杠的路径类参数(如
/file/path/name.txt):->pattern(['name' => '\S+'])(比.*更安全) - 慎用
.*:->pattern(['name' => '.*'])可能吞掉后续路由段,务必在业务层二次校验
pattern() 只对命名变量生效,对查询参数和模糊占位符无效
pattern() 是路由层的强校验,但只作用于显式声明的变量,比如 {id}、<id></id> 或 :id(TP5),它不会影响:
- GET 查询参数(如
?id=abc),这类需用验证器或input()手动过滤 -
/:xxx?这种可选模糊写法(TP5 风格),pattern()不触发 - 未在路由定义中声明的变量名,即使控制器方法里写了
$id,也拿不到值
最容易被忽略的一点:pattern 约束失败时,ThinkPHP 默认返回 404,而不是进控制器再抛异常——这意味着你可能根本没意识到某条路由已被静默拦截,直到前端报错才去翻日志。务必在开发期用 php think route:list 确认规则已加载且 pattern 显示正常。


















