我知道没有"真正的解决方案"可以注销http,因为它是无状态的。然而,我所需要的只是一个变通办法。我试图实现的是,当点击注销链接时,它会重定向到logout.php文件。该文件再次调用基本身份验证标头。我想让php代码传入一个伪造的密码,然后重定向到我的主页,用户将在那里"注销"。
我意识到他们实际上不会被注销,而是浏览器会尝试使用最新的身份验证凭据,这些凭据将被传递进来,并且是不正确的,因此会让用户使用有效凭据重新登录。
我基本上没有php经验,也不知道如何对传递的错误密码进行编码。
感谢您的帮助。
logout.php
<?php
session_start();
session_write_close();
header('HTTP/1.1 401 Access Denied');
header('WWW-Authenticate: Basic realm="HTTPS File Upload"');
header('HTTP/1.0 401 Unauthorized');
header('Location: http://www.homepage.com')
?>
本页的示例#3可能与您想要的非常接近。
http://php.net/manual/en/features.http-auth.php
您可以采取的另一种方法是实现PHP会话。这里有一个很好的基本阅读。
http://phpmaster.com/php-sessions/
编辑-若您添加了一个PHP会话,就不需要强制使用无效凭据(是的,两者都可以)。即使您拥有的唯一会话变量是布尔值$_session["IsLoggedIn"]。使用上述变量,您可以将其添加到示例#3中的if语句中,如下所示,并通过logout.php脚本将其从会话中删除。
if (!isset($_SESSION["IsLoggedIn"]) || !isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
...
}
不要忘记使用session_start();每当您使用$_SESSION变量时,都会在页面顶部显示。
它确实有效:
<?php
if (!isset($_SERVER['PHP_AUTH_USER']) or isset($_POST['logout'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo '<h1>Access Denied!</h1>';
exit;
} else {
if(!($_SERVER['PHP_AUTH_USER']=='admin' and md5($_SERVER['PHP_AUTH_PW'])=='d81edf2e48ddddddddd631e374c5932d'))
{
header('HTTP/1.0 401 Unauthorized');
exit;
}
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>
<html>
<head>
</head>
<body>
<form method="POST">
<button name="logout" type="submit">Log Out</button>
</form>
</body>
</html>
Basic http auth通过在每个请求中传递用户名/密码来工作。浏览器通常会存储凭据并在每次请求中传递,因此您的解决方案不能是服务器端的,如果可能的话,您必须想办法告诉浏览器忘记凭据。
将http响应代码设置为:
401
响应标头必须包括:
WWW-Authenticate : Basic
现在,用户刷新时将被提示登录。
p.S.Chromium浏览器会提示用户仅从401代码登录,所以我会用IE进行测试。此外,私人浏览模式是你的朋友。