Laravel 5.8如何实现仅带ID的根路径路由访问客户资料
Laravel 根路径通配符路由实现方案解答
问题1:最优实现方案及路由放底部的可行性分析
- 你观察到的路由必须放底部才生效是Laravel的默认规则:路由是自上而下匹配的,
/{id}属于通配符路由,会匹配所有一级路径的请求,放在前面的话会把/about-us这类路由全部拦截,所以放底部是常规的兼容写法,本身是可行的,只要做好配套处理不会有安全风险。 - 比单纯放底部更优的实现方案是给通配符路由添加参数约束,缩小匹配范围:
如果你的客户ID是纯数字格式,可以直接给路由加正则校验:
加了这个约束之后,只要你的其他业务路由(比如Route::get('/{id}', 'ExampleController@myfunction') ->name('profiler') ->where('id', '[0-9]+'); // 只匹配纯数字的路径参数/about-us、/contact)不是纯数字命名,这条路由哪怕不放最底部也不会和其他路由冲突,从根源避免了后续加新路由时漏放位置导致的故障。 - 只放底部不加约束的弊端:
所有未匹配到的请求都会走到该路由对应的控制器方法,包括用户输入的错误路径、爬虫爬取的无效路径,你需要在控制器里额外处理ID不存在时的404返回逻辑,会增加一点额外的服务器开销,另外后续新增路由时必须放在这条路由前面,对维护规范要求更高。
安全风险方面只要你在控制器内做好了权限校验(比如非公开的客户资料要校验访问者权限、防止越权访问任意ID的资料),就不会产生额外的安全问题。
问题2:无前缀路由和前缀路由的选择建议
- 如果你的业务有强需求必须使用无前缀的URL格式,完全可以坚持使用该方案,只要做好两个配套处理即可:
- 给路由加参数正则约束,尽可能缩小匹配范围
- 控制器内做好参数合法性校验、权限校验、不存在ID的404响应处理
- 如果没有强业务要求,加统一前缀的方案维护成本更低,不需要考虑路由冲突问题,后续迭代的容错率更高。
内容的提问来源于stack exchange,提问作者Faran Khan
相关产品推荐
相关产品推荐

