Laravel路由where子句配置问题:访问指定URL出现404错误
解决Laravel多步骤向导表单的路由匹配问题
你的问题出在路由正则的写法和参数匹配规则上,调整路由配置就能解决404问题:
方案一:单路由参数匹配所有场景
把路由改成如下写法:
->get('{step}', [StepController::class, 'show']) ->where('step', 'address-sender(/.*)?|address-receiver(/.*)?|shipping-confirmation') ->name('auth.step.show');
关键说明:
- 原来的
address-sender?/*里的?是正则量词,会把sender的最后一个字符设为可选,完全不符合你「匹配address-sender后任意路径」的需求。 (/.*)?表示匹配可选的斜杠+任意内容,既能匹配address-sender本身,也能匹配address-sender/manual、address-sender/xxx/yyy这类带后续路径的地址。- Laravel默认路由参数不包含斜杠,通过这个正则规则,允许
step参数包含斜杠,从而完整匹配后续路径。
方案二:拆分路由提升可读性
如果觉得单正则太复杂,也可以拆成多个路由,逻辑更清晰:
// 匹配address-sender及后续任意子路径 ->get('address-sender/{substep?}', [StepController::class, 'show']) ->where('substep', '.*') // 匹配address-receiver及后续任意子路径 ->get('address-receiver/{substep?}', [StepController::class, 'show']) ->where('substep', '.*') // 匹配shipping-confirmation单独路径 ->get('shipping-confirmation', [StepController::class, 'show']) ->name('auth.step.show');
这里给substep添加.*正则规则,允许它匹配任意内容(包括空值,因为参数是可选的{substep?}),这样访问address-sender或者address-sender/manual都能命中路由。
两种方案都能解决你访问address-sender/manual、address-receiver/manual时出现的404问题。
内容的提问来源于stack exchange,提问作者Abdul Shakoor Kakar
相关产品推荐
相关产品推荐

