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

Slim 4:如何获取初始URL以实现登录后重定向

在Slim PHP v4中实现登录后重定向到原访问页面

要解决登录后无法回到原访问页面的问题,核心是在重定向到登录页前把用户原本要访问的URL存入会话(Session),登录验证通过后再从会话中取出这个URL完成跳转。

1. 修改登录重定向中间件,保存原访问URL

在你的RedirectVisitorToLogin中间件中,添加会话存储逻辑,把用户当前请求的URL存起来(注意排除登录页面本身,避免循环重定向):

<?php
namespace App\Middleware;

use App\Middleware\Middleware;
use Slim\Routing\RouteContext;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;

class RedirectVisitorToLogin extends Middleware {
    public function __invoke(Request $request, RequestHandler $handler) {
        // 先确保会话已启动(如果应用全局没启动的话)
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }

        if (!$this->c->get('auth')->check()) {
            $routeParser = RouteContext::fromRequest($request)->getRouteParser();
            $loginPath = $routeParser->urlFor('auth.signin');
            $currentPath = $request->getUri()->getPath();

            // 仅当当前页面不是登录页时,保存原访问路径
            if ($currentPath !== $loginPath) {
                $_SESSION['redirect_url'] = $currentPath;
            }

            return $handler->handle($request)
                ->withHeader('Location', $loginPath)
                ->withStatus(302);
        }

        return $handler->handle($request);
    }
}

2. 登录验证成功后,重定向到原URL

在你的登录处理逻辑(比如AuthController的登录方法)中,验证用户凭证通过后,从会话中取出保存的URL进行跳转,跳转后记得清除会话中的记录:

<?php
namespace App\Controllers;

use Slim\Routing\RouteContext;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;

class AuthController {
    public function signin(Request $request, Response $response) {
        // 假设这里是获取用户提交的登录凭证逻辑
        $credentials = $request->getParsedBody();
        $auth = $this->c->get('auth');
        $routeParser = RouteContext::fromRequest($request)->getRouteParser();

        if ($auth->attempt($credentials)) {
            // 优先使用会话中保存的原URL,没有则跳转到默认页面(比如仪表盘)
            $redirectUrl = $_SESSION['redirect_url'] ?? '/dashboard';
            // 清除会话中的记录,避免后续重复跳转
            unset($_SESSION['redirect_url']);

            return $response
                ->withHeader('Location', $redirectUrl)
                ->withStatus(302);
        }

        // 登录失败的处理逻辑(比如返回错误信息到登录页)
        return $response->withHeader('Location', $routeParser->urlFor('auth.signin'))->withStatus(302);
    }
}

注意事项

  • 确保你的Slim应用已经正确启用了会话机制,如果全局没启动会话,需要在中间件或应用初始化阶段调用session_start()。
  • 如果原访问URL带有查询参数(比如/report?date=2024),可以用$request->getUri()->__toString()来保存完整URL,而不仅仅是路径。

内容的提问来源于stack exchange,提问作者cesarcarlos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:44:59