发布于2026-07-07 阅读(0)
扫一扫,手机访问
先说一个很常见的问题:很多人在 ThinkPHP 路由里定义了个 {id} 占位符,以为传进来的就一定是数字——结果被各种 123abc、../ 甚至中文塞进去,直接原地 404 或者报错。根源在于,TP 路由变量的默认匹配规则只是 [a-zA-Z0-9_-]+,压根不认中文和点号。不加正则约束?那就等于裸奔。关键不是“要不要加”,而是“怎么加才能让约束真正卡住”。
很多人踩的第一个坑就是这个:写了 {uid} 和 {pid},然后在 pattern() 里写的 key 却是 id。不好意思,完全没用。占位符的名字和数组的 key 必须一字不差,否则约束等同虚设。
Route::get('user/{uid}/{pid}', 'user/info')->pattern(['uid' => '\d+', 'pid' => '\d+'])->pattern(['id' => '\d+']) —— {uid} 和 {pid} 依然来者不拒{token},pattern 就得写 ['token' => '[a-zA-Z0-9_]{16,32}'],不能偷懒写成 ['key' => ...]ThinkPHP 的路由正则并不是完整的 PCRE 实现。像 ^、$、分组括号 () 这些,直接写进去要么被忽略,要么直接报错。它只认纯规则片段,要么用内联写法,要么写进 pattern()。
Route::rule('article/{id}', 'index/read')->pattern(['id' => '\d+'])Route::rule('user/{id:\d+}', 'user/info')Route::rule('^user/(\d+)$', 'user/info') —— 会被当成静态路由,\d+ 就是个摆设->pattern(['id' => '^\d+$']) —— ^ 和 $ 在这里不会被识别
默认规则不认中文、点号、URL 中的斜杠。想让它们通行,必须显式定义 pattern,并且带上 u 修饰符(PHP PCRE 的 UTF-8 模式)。
->pattern(['title' => '[\x{4e00}-\x{9fa5}a-zA-Z0-9_-]+'])/file/path/to/name.txt):->pattern(['name' => '\S+']) —— \S+ 匹配非空白字符,比 .* 更安全.* 也不是不行,->pattern(['name' => '.*']) 确实能匹配任意内容,但很可能吞掉后面的路由段。所以用了 .* 之后,业务层一定要做二次校验,否则后患无穷写个 Route::post() 就完事儿了?没那么简单。它只是把路由注册进了 POST 分组,并不等于其他方法就不能来访问。真正想让请求方法限制生效,你得做两件事:
Route::rule('/api/login', 'Login/login', 'POST')'url_route_must' => true(在 config/route.php 里)group),method 限制必须写在组内,不能只写在外面就指望它生效
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8