thinkphp 8.0 路由变量默认不支持斜杠,需用 pattern(['path' => '[\w/.-]+']) 显式允许;控制器中须过滤路径遍历并校验空值。

ThinkPHP 8.0 中,路由变量默认**不支持斜杠(/)**,因为框架会以 / 为路径分段符进行切割。比如你写 Route::get('file/<path>', ...)</path>,当访问 /file/download/123/abc.pdf 时,$path 实际只拿到 download,后面全被截断——这不是 bug,是设计机制。
必须用 pattern 显式放行斜杠
TP 8.0 不像 Laravel 那样支持 .* 正则直接写在参数后,它要求通过 pattern() 方法传入合法字符集,且需明确允许 / 出现在变量值中。
-
不能写
[\w\-\.]+:这个正则不含/,遇到路径类参数(如logs/2026/10/error.log)仍会截断 -
推荐写法:
pattern(['path' => '[\w\/\.\-]+']):显式加入\/(注意 PHP 字符串中需转义),才能匹配含斜杠的任意路径片段 -
若要兼容开头或结尾的斜杠,可放宽为
'path' => '[\w\/\.\-]*',但需在控制器里二次校验,避免空值或纯/
完整示例:定义一个可接收多级路径的路由
在 route/app.php 中:
Route::get('file/<path>', 'File/read')
->pattern(['path' => '[\w\/\.\-]+']);
</path>
控制器中接收:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
public function read(string $path)
{
// 安全过滤:移除可能的路径遍历
$path = str_replace(['..', '//'], '', $path);
$path = trim($path, '/');
if (empty($path)) {
abort(400, 'Invalid path');
}
// 后续读取文件逻辑
}
注意 pattern 的作用范围和限制
pattern() 只对当前路由生效,且仅影响该变量的匹配规则,不会改变 URL 解析顺序。
- 多个变量需分别指定,例如
pattern(['id' => '\d+', 'path' => '[\w\/\.\-]+']) - 正则中的特殊字符(如
.、-、/)必须转义或放在字符组内,否则语法报错 - TP 8.0 不支持
.*这种模糊通配,.*在 pattern 中会被当作字面量处理,起不到通配作用
替代方案:用 <path></path> + 全局闭包预处理
如果 pattern 写法复杂或需要动态判断,可在路由注册前加一层闭包,提前从 Request::pathinfo() 中提取完整路径段:
Route::get('file/*', function () {
$fullPath = request()->pathinfo();
$segments = explode('/', $fullPath);
$path = implode('/', array_slice($segments, 2)); // 跳过 'file' 前缀
return app('controller')->invokeMethod('File@read', [$path]);
});
这种方式绕过变量绑定机制,完全可控,适合复杂路径解析场景。










