如何使用ThinkPHP对斜杠路由参数进行编码解码?
- 内容介绍
- 文章标签
- 相关推荐
本文共计891个文字,预计阅读时间需要4分钟。
ThinkPHP默认将URL中的/作为路径分隔符,而不是参数的一部分。因此,在路由定义中,如果你写了/:id,框架在解析阶段就会提前截断,不会继续到你的控制器。
例如,如果你想要匹配类似user/123的URL,只需使用$id变量即可,而不是直接写参数名:
用 [:id] 方式捕获带斜杠的参数(5.1+ 推荐)
ThinkPHP 5.1 及以上支持「可选段」语法 [:id],它会贪婪匹配直到下一个固定路径段或 URL 结尾,天然兼容斜杠。但要注意两点:必须确保该参数是路由末尾,且不能和后续固定路径冲突。
- 正确写法:
route('article/[:path]', 'index/article/read'),访问/article/user/123/edit时,$path值为user/123/edit - 错误写法:
route('article/[:path]/detail', ...),这种写法无法区分/article/a/b/detail中的a/b和a,实际匹配不可靠 - 控制器接收时,
$path是原始字符串,无需额外解码,但需自行校验合法性(如防止路径穿越)
URL 编码不是万能解,%2F 在 ThinkPHP 中默认仍被截断
很多人尝试对斜杠做 encodeURIComponent('a/b') 得到 a%2Fb,再拼进 URL。
本文共计891个文字,预计阅读时间需要4分钟。
ThinkPHP默认将URL中的/作为路径分隔符,而不是参数的一部分。因此,在路由定义中,如果你写了/:id,框架在解析阶段就会提前截断,不会继续到你的控制器。
例如,如果你想要匹配类似user/123的URL,只需使用$id变量即可,而不是直接写参数名:
用 [:id] 方式捕获带斜杠的参数(5.1+ 推荐)
ThinkPHP 5.1 及以上支持「可选段」语法 [:id],它会贪婪匹配直到下一个固定路径段或 URL 结尾,天然兼容斜杠。但要注意两点:必须确保该参数是路由末尾,且不能和后续固定路径冲突。
- 正确写法:
route('article/[:path]', 'index/article/read'),访问/article/user/123/edit时,$path值为user/123/edit - 错误写法:
route('article/[:path]/detail', ...),这种写法无法区分/article/a/b/detail中的a/b和a,实际匹配不可靠 - 控制器接收时,
$path是原始字符串,无需额外解码,但需自行校验合法性(如防止路径穿越)
URL 编码不是万能解,%2F 在 ThinkPHP 中默认仍被截断
很多人尝试对斜杠做 encodeURIComponent('a/b') 得到 a%2Fb,再拼进 URL。

