You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5路由分组where规则失效,如何生成指定格式URL?

问题解答

嘿,我来帮你理清楚这个问题~首先你当前的路由代码没法实现目标URL,核心原因有两个:一是你没定义出匹配/product/xxx的路由规则,二是你可能误解了路由前缀where()约束的作用范围。

先看你现在的代码:

Route::prefix('{page}')->name('the_url')->group(function () { 
    Route::get('/', 'HomeController@page') ->name('index'); 
})->where('page', '(url1|url2)');

这段代码只能匹配http://example.com/url1或http://example.com/url2,完全没处理/product/xxx的部分,所以你想要的url1/product/blabla这类路径自然匹配不到。

接下来给你两种针对性的解决方案:

一、先搞定目标URL的路由定义

如果你要创建/{page}/product/{slug}这类路径(也就是你要的url1/product/blabla),只需要在路由分组里添加对应的路由即可,而且完全不需要给每个路由单独加where()规则——因为前缀上的where()约束会对整个分组内的{page}参数生效:

Route::prefix('{page}')->name('the_url.')->where('page', '(url1|url2)')->group(function () {
    // 匹配 /url1 或 /url2
    Route::get('/', 'HomeController@page')->name('index');
    // 匹配 /url1/product/blabla 或 /url2/product/aiueo
    Route::get('/product/{slug}', 'ProductController@show')->name('product.show');
});

这样设置后:

  • 访问/url1/product/blabla会触发ProductController@show方法,$page参数是url1,$slug参数是blabla
  • 前缀上的where('page', '(url1|url2)')会全局限制这个分组里所有路由的{page}只能是url1或url2,不用在每个路由里重复写约束

二、如果要给其他参数加约束怎么办?

要是你还想给{slug}这类路由参数加规则,那确实需要针对每个参数单独设置where(),或者在分组上统一配置多个参数的约束:

比如单独给{slug}加约束:

Route::get('/product/{slug}', 'ProductController@show')
    ->name('product.show')
    ->where('slug', '[a-z0-9\-]+');

或者在分组上统一配置多个参数的约束,这样分组内所有用到这些参数的路由都会生效:

Route::prefix('{page}')->name('the_url.')->where([
    'page' => '(url1|url2)',
    'slug' => '[a-z0-9\-]+'
])->group(function () {
    Route::get('/', 'HomeController@page')->name('index');
    Route::get('/product/{slug}', 'ProductController@show')->name('product.show');
});

总结一下你的核心疑问

不需要在{page}前缀内的每个路由方法中单独使用where()规则——分组上的where()约束会覆盖整个分组内所有路由对应的参数。你现在的问题主要是没在分组里定义出匹配/product/{slug}的路由,所以才没法生成你想要的URL。

内容的提问来源于stack exchange,提问作者ilubis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:19:03