Laravel 5.8 非虚拟主机环境下如何正确获取上一请求的路由名称
Laravel 5.8 子目录部署下获取上一个请求路由名称解决方案
问题根因
原有方案在子目录部署(IP+项目路径访问)时,生成的请求路径会携带项目目录前缀,和路由定义的无前缀路径无法匹配,导致抛出NotFoundHttpException异常。
可行方案
方案1:动态移除路径前缀匹配路由
不需要改动全局配置,适合临时使用的场景,代码如下:
use Illuminate\Support\Facades\Route; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; // 获取上一页URL并生成请求实例 $previousRequest = \Illuminate\Http\Request::create(url()->previous()); // 移除项目路径前缀,提取纯净路由路径 $cleanPath = ltrim(str_replace($previousRequest->getBaseUrl(), '', $previousRequest->getPathInfo()), '/'); $previousRouteName = null; try { // 用纯净路径匹配路由 $matchedRoute = Route::getRoutes()->match(\Illuminate\Http\Request::create($cleanPath)); $previousRouteName = $matchedRoute->getName(); } catch (NotFoundHttpException $e) { // 上一页为外部链接或无效路由时的兜底处理 $previousRouteName = null; } // 业务逻辑判断 if ($previousRouteName == 'show_name') { // 执行对应逻辑 }
方案2:中间件记录路由(更稳定,无环境兼容问题)
适合项目多处需要用到上一个路由名称的场景,完全不受部署路径影响:
- 新建中间件
app/Http/Middleware/RecordPreviousRoute.php
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Session; class RecordPreviousRoute { public function handle($request, Closure $next) { // 当前请求路由有效时,存入session作为下一次请求的上一路由 if ($request->route()) { Session::put('previous_route_name', $request->route()->getName()); } return $next($request); } }
- 注册中间件到
app/Http/Kernel.php的web中间件组
protected $middlewareGroups = [ 'web' => [ // 原有其他中间件 \App\Http\Middleware\RecordPreviousRoute::class, ], ];
- 业务逻辑中直接调用即可
if (session('previous_route_name') == 'show_name') { // 执行对应逻辑 }
内容的提问来源于stack exchange,提问作者Cheyner Pérez Barreda
相关产品推荐
相关产品推荐

