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

CodeIgniter4登录后拦截登录页时出现重定向过多问题求助

CodeIgniter4 登录后拦截登录页引发重定向过多问题修复

问题核心

要实现「已登录用户无法访问登录页」的逻辑,但移除过滤器except列表中的login项后,登录页和app/dashboard都出现重定向过多错误。

现有代码分析

登录控制器(关键片段)

public function login()
{
    $validated = $this->validate([
        'email' => 'required|valid_email',
        'password' => 'required',
    ],[
        'email'=> [
            'required' => 'E-mail required',
            'valid_email' => 'E-mail not valid',
        ],
        'password'=> [
            'required'=>'Password required',
        ]
    ]);

    if (!$validated) {
        return redirect()->route('login')->with('errors', $this->validator->getErrors());
    } else {
        $email = $this->request->getPost('email');
        $password = $this->request->getPost('password');
    }

    // 后续登录验证逻辑...
}

public function logout()
{
    session()->destroy();
    return redirect()->to(base_url('login'));
}

Auth过滤器

if ((bool)session()->isLoggedIn != true) {
    return redirect()->to(base_url('login'));
}

过滤器配置(config/Filter.php)

'before' => [
    'auth'=> [
        'except' => [
            'login',
            '/',
            'search/*',
            'post/*',
            'sobre',
            'contato'
        ]
    ]
]

错误原因

  1. 未登录用户访问登录页的循环:当移除except中的login后,所有访问登录页的请求都会经过auth过滤器。此时未登录用户访问登录页,过滤器会因「未登录」强制重定向到登录页,形成无限循环。
  2. 已登录用户访问登录页的循环:登录控制器未在开头判断用户是否已登录,已登录用户访问登录页时,会执行表单验证逻辑(GET请求无POST数据,验证失败),进而重定向回登录页,触发循环。

修复方案

1. 修改Auth过滤器逻辑

在过滤器中区分处理「未登录用户」和「已登录用户」的路由访问:

$isLoggedIn = session()->get('isLoggedIn') ?? false;
// 获取当前访问的路由(控制器::方法)
$currentRoute = service('router')->controllerName() . '::' . service('router')->methodName();

// 定义公开路由列表
$publicRoutes = [
    'LoginController::login',
    'HomeController::index', // 对应 '/'
    'SearchController::*',   // 对应 'search/*'
    'PostController::*',     // 对应 'post/*'
    'PageController::sobre',
    'PageController::contato'
];

// 检查当前路由是否为公开路由(支持通配符匹配)
$isPublic = false;
foreach ($publicRoutes as $route) {
    if (fnmatch($route, $currentRoute)) {
        $isPublic = true;
        break;
    }
}

// 未登录用户:非公开路由跳转到登录页
if (!$isLoggedIn && !$isPublic) {
    return redirect()->to(base_url('login'));
}

// 已登录用户:访问登录页时跳转到dashboard
if ($isLoggedIn && $currentRoute === 'LoginController::login') {
    return redirect()->to(base_url('app/dashboard'));
}

2. 登录控制器增加已登录判断

在login方法开头添加会话检查,双重保险避免循环:

public function login()
{
    // 已登录用户直接跳转到dashboard
    if (session()->get('isLoggedIn') === true) {
        return redirect()->to(base_url('app/dashboard'));
    }

    // 原有的表单验证及登录逻辑...
}

3. 调整过滤器配置

将login从except列表中移除,让所有请求都经过auth过滤器处理:

'before' => [
    'auth'=> [
        'except' => [
            '/',
            'search/*',
            'post/*',
            'sobre',
            'contato'
        ]
    ]
]

验证逻辑

  • 未登录用户:仅能访问公开路由,访问app/dashboard会被跳转到登录页
  • 已登录用户:访问登录页会被直接跳转到app/dashboard,无法进入登录页面
  • 不会出现重定向循环问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:56:20