【问题标题】:Redirect with HTTP 403使用 HTTP 403 重定向
【发布时间】:2020-01-08 14:01:54
【问题描述】:

我正在使用 Slim PHP,如果用户未登录但尝试访问需要用户登录的页面,我希望将用户重定向到 /login。在搜索如何构建我的中间件时,我到处查找此代码的变体

class Auth{    
    public function requireLogin(Request $request, Response $response, $next){
        if( !isLoggedIn() ) return $response->withRedirect('/login', 403);

        return $next($request, $response);
    }    
}

例如在this SO answerthis Slim discourse answer

问题是我无法将重定向和 HTTP 403 结合使用。据我所知,正常的 HTTP 重定向仅限于 HTTP codes 3xx。实际上,上面的代码在与 302 一起使用时可以正常工作。

我是否遗漏了什么,或者所有结合 withRedirect403 的答案“不正确”(因为不会导致用户浏览器的实际重定向)?

【问题讨论】:

  • 403 特别是 Forbidden 它根本不是重定向标头...我认为您最好亲自做一个或另一个;例如您可以 302登录失败页面。
  • 这是你会在 API 中看到的那种东西,API 会返回 403(实际上更多的是 401)然后前端会捕捉到这个错误,通过将你重定向到登录来处理它页。在您的情况下,由于是 PHP 重定向它,您可以抛出异常并在错误处理程序中捕获它,但您不会看到 403 错误。在你的情况下你有点不需要它。
  • 作为 403 和 401 之间的说明。403 错误代码表示身份验证成功,但用户缺少执行操作所需的权限。 401 仅表示访问此页面或此操作需要身份验证。在你的情况下,我认为 401 错误会更合适。
  • 这个其他问题似乎相关stackoverflow.com/questions/2839585/…

标签: php slim http-status-code-403 http-redirect slim-3


【解决方案1】:

如果您的应用程序是使用 Web 浏览器访问的 HTML 网站,则浏览器仅在状态代码为 3xx 时才会重定向。

如果您的应用程序是使用 HTTP 客户端访问的 API,那么您有更多的余地。对于 API,您可以使用 403401 状态代码来指示未经授权无法完成请求。您还可以包含 Location 标头来告诉客户去哪里获得授权,但当然,如果他们跟进该链接,则取决于客户。

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 2011-08-27
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多