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

如何解决全局登录校验中间件引发的无限重定向循环?

解决登录验证中间件无限重定向并排除指定路由的问题

你的无限重定向循环是因为应用级中间件会拦截所有请求,包括/login路由。当未登录用户访问/login时,中间件检测到req.user不存在,会重定向到/login,进而再次触发中间件,形成死循环。

要通过app.use(loginCheck)实现全局应用中间件但排除/login路由,有两种可行方案:

方案一:在中间件内部排除指定路径

直接修改中间件代码,判断当前请求路径是否为/login,如果是则直接放行,不做登录验证:

module.exports = (req, res, next) => {
    // 排除登录页面请求,直接放行
    if (req.path === '/login') {
        return next();
    }

    // 非登录页面执行登录验证逻辑
    if (req.user === undefined) {
        console.log('Login Required');
        return res.redirect('/login');
    }

    next();
};

修改后直接使用app.use(loginCheck)即可,中间件会自动跳过/login路由,避免重定向循环。如果后续需要排除其他路由(比如注册页/register),可以扩展判断条件:

if (['/login', '/register'].includes(req.path)) {
    return next();
}

方案二:通过app.use的路径匹配规则排除路由

利用正则表达式匹配除/login之外的所有路径,再应用中间件:

// 正则匹配:以/开头,且后面不是login(精确匹配/login)
app.use(/^\/(?!login$)/, loginCheck);

这种方式无需修改中间件代码,但正则匹配需要注意路径的精确性,比如不会排除/login/xxx这类嵌套路径,适合路由规则简单的场景。

内容的提问来源于stack exchange,提问作者고태성

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:02:16