在中间件中重定向请求的正确方法是什么?

时间:2015-07-22 15:41:19

标签: php redirect infinite-loop middleware slim

我正在尝试在Slim微框架中将(in)着名的improved persistent session实现为中间件。

在算法描述的某些地方,应用程序应检查用户的cookie,并在用户的cookie已过期或无效时重定向用户。不幸的是,由于两个原因,不可能从中间件中重定向用户:

  1. Slim的redirect只能在命名路线中使用;
  2. redirect将创建一个全新的请求,从而重新启动Slim应用程序。之前触发重定向的相同条件将被重新触发,从而创建无限循环。
  3. 问题1可以通过巧妙地使用钩子来解决,但我不知道如何解决问题2.我注意到some middleware通过使用自定义异常解决了这个问题,然后他们用Slim的错误处理程序捕获,然后调用重定向:

    // Handle the possible 403 the middleware can throw
    $app->error(function (\Exception $e) use ($app) {
        ...
        if ($e instanceof HttpUnauthorizedException) {
            return $app->redirectTo('login');
        }
        ...
    });
    

    但我不确定这是最好的方法。还有其他方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

上面列出的内容是一种完美的方式,通常是如何完成的。假设您的登录页面没有检查HttpUnauthorizedExcepion,那么就无法重定向循环。