修改Laravel路由后访问/login、/admin报404错误是什么原因?
问题根源
Laravel路由遵循从上到下优先匹配的规则,你新增的根路径可选参数路由/{location?}属于通用通配路由,配置位置在admin路由组、Auth::routes()认证路由之前:
- 访问
/admin、/login等路径时,系统会优先匹配该通配路由,将admin/login作为location参数传入LocationController@show - 由于该方法使用了隐式模型绑定,会自动查询主键/标识为
admin/login的Locations模型,查询不到就直接返回404,不会继续匹配后面定义的admin、认证路由。
解决方案
1. 调整路由顺序
所有具体路由必须放在通配类路由之前,把Route::get('/{location?}', ...)移动到路由文件的最末尾,优先级最低。
2. 为通配路由增加正则约束(可选但推荐)
为了避免后续新增路由时再次出现匹配冲突,可以给location参数增加正则校验,排除系统预留路径:
Route::get('/{location?}', 'LocationController@show') ->name('location.details') // 正则排除admin、login、register等预留路径,有其他预留路径可自行追加 ->where('location', '^((?!admin|login|register).)*$');
调整后的完整路由参考
Route::get('/', 'StartpageController@index')->name('startpage'); Route::prefix('admin')->group(function () { Route::name('admin.')->group(function () { Route::middleware('auth')->group(function () { Route::get('/', function () { return view('admin'); }); Route::resource('location','AdminLocationController'); }); }); }); Auth::routes(); // 通配路由放最后,加正则约束 Route::get('/{location?}', 'LocationController@show') ->name('location.details') ->where('location', '^((?!admin|login|register).)*$');
内容的提问来源于stack exchange,提问作者lyze
相关产品推荐
相关产品推荐

