Laravel 11前缀路由组内部分路由返回404错误求助
Laravel 11前缀路由组内部分路由返回404错误求助
我目前在用Laravel 11.27.2和PHP 8.2,碰到个挺头疼的问题:前缀路由组里的部分路由老是返回404错误,但只要把这些路由移到组外,立马就正常了,啥毛病都没有。另外还有个奇怪的点——如果把出问题的路由挪到前缀组里的最顶部,它也能正常工作。
我试过执行命令 php artisan route:clear 清路由缓存,但情况一点没变。不过用 php artisan route:list 查看路由列表时,这些有问题的路由都能正常显示出来。
下面是不工作的路由代码:
Route::prefix('giveaway')->name('giveaway.')->group(function () { Route::get('/{id}', [GiveawayController::class, 'show'])->name('show'); Route::post('/store/{id}', [GiveawayController::class, 'store'])->name('store'); Route::get('/thank-you', [GiveawayController::class, 'thankYou'])->name('thank-you'); });
其实这个问题本质是路由匹配顺序的锅!你看,/{id} 是个动态参数路由,Laravel匹配路由是从上到下的,它会把所有以 /giveaway/ 开头的GET请求都先匹配到这个路由——包括 /giveaway/thank-you,因为Laravel会把thank-you当成id参数的值,直接走到show方法,根本轮不到后面的/thank-you路由。
给你两个解决办法:
- 调整路由顺序,把静态路由放在动态路由前面
Route::prefix('giveaway')->name('giveaway.')->group(function () { Route::get('/thank-you', [GiveawayController::class, 'thankYou'])->name('thank-you'); Route::get('/{id}', [GiveawayController::class, 'show'])->name('show'); Route::post('/store/{id}', [GiveawayController::class, 'store'])->name('store'); });
这样Laravel会先匹配静态的/thank-you路由,剩下的动态请求才会走到/{id}那里。
- 给动态路由的
id参数添加约束
比如限定id只能是数字,这样thank-you就不会被误匹配了:
Route::prefix('giveaway')->name('giveaway.')->group(function () { Route::get('/{id}', [GiveawayController::class, 'show'])->name('show')->where('id', '[0-9]+'); Route::post('/store/{id}', [GiveawayController::class, 'store'])->name('store'); Route::get('/thank-you', [GiveawayController::class, 'thankYou'])->name('thank-you'); });
这样即使路由顺序不变,/giveaway/thank-you因为不符合数字约束,就会跳过这个路由,继续匹配后面的/thank-you了。
备注:内容来源于stack exchange,提问作者Developer lci-agency
相关产品推荐
相关产品推荐

