这可能更像是一个 PHP 和 SO 问题,但由于它涉及 HTTP 代码,所以我想先在这里问。
因此,我正在构建一个非常简单的用户身份验证后端,它基本上会检查(相当安全的)会话令牌以确认用户的会话是否存在且有效。 如果全部检查无误,则页面加载,如果身份验证失败,则将用户重定向到登录页面。
我想使用 401 HTTP 状态代码而不是 302,以便它可以在浏览器级别和服务器日志中反映浏览器正在尝试访问尚未授权的页面,但这并未成功。
根据几个示例,我尝试在文件ErrorDocument
中设置指令.htaccess
,但没有成功(404 重定向可以正常工作)。我通过脚本发送了各种标头组合,其中最有希望的三种组合是:
header('Location: http://mysite.org/login.php', 1, 401);
浏览器显示 401 响应,但没有重定向。
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
header('Location: http://mysite.org/login.php');
浏览器重定向,但显示原始页面重定向为 302。
header('WWW-Authenticate: Basic realm="My Realm"');
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
header('Status: 401 Unauthorized');
header('Location: http://mysite.org/login.php');
对于最后一个,我尝试了带和不带Location
标题的情况,带和不带的情况Status
,但在所有组合中它只会触发浏览器的基本身份验证对话框。
那么,是否有正确或推荐的方法来处理基于 Web(非浏览器默认)的未经授权的重定向?
我知道我可以采用正常方式302
,但在我放弃之前,我想知道这是否是唯一的选择(或唯一符合标准的选择)。
答案1
根据RFC 2616,第 10.4 节,4XX
响应代码表示错误,并且浏览器没有指示遵循Location
响应中的任何标头。此外,401
响应代码用于严格用于 HTTP 身份验证,以及RFC 2617 必须被遵循。
我建议改用303
或302
响应代码。