据我所知,登录http没有“真正的解决方案”,因为它是无状态的。但是,我只需要一个解决方法。我想要实现的是当点击注销链接时,它会重定向到logout.php文件。该文件再次调用基本的auth标头。我想让php代码传入一个伪造的密码,然后重定向到我的主页,用户将“登出”。
我意识到他们实际上不会被注销,而是浏览器将尝试使用最新的auth凭证,这些凭证将被传入并且不正确,因此使用户重新登录有效的凭证。
我基本上没有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')
?>
答案 0 :(得分:1)
此页面上的示例#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变量,都会在页面顶部显示。
答案 1 :(得分:1)
确实有效:
<?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>
答案 2 :(得分:0)
Basic http auth通过为每个请求传递用户名/密码来工作。浏览器通常会存储凭据并在每个请求中传递它们,因此您的解决方案不能是服务器端,您必须找出一种方法来告诉浏览器忘记凭据,如果可能的话。
答案 3 :(得分:0)
将http响应代码设置为:
401
响应标头必须包含:
WWW-Authenticate : Basic
现在,用户在刷新时会被提示登录。
P.S。 Chromium浏览器将提示用户仅从401代码登录,因此我将使用IE进行测试。另外,隐私浏览模式是你的朋友。