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

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:中间件记录路由(更稳定,无环境兼容问题)

适合项目多处需要用到上一个路由名称的场景,完全不受部署路径影响:

  1. 新建中间件 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);
    }
}
  1. 注册中间件到 app/Http/Kernel.php 的web中间件组
protected $middlewareGroups = [
    'web' => [
        // 原有其他中间件
        \App\Http\Middleware\RecordPreviousRoute::class,
    ],
];
  1. 业务逻辑中直接调用即可
if (session('previous_route_name') == 'show_name') {
    // 执行对应逻辑
}

内容的提问来源于stack exchange,提问作者Cheyner Pérez Barreda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:00:04