Выход из дайджест-аутентификации PHP

интернет программирование программы php проблема

Нужно, чтобы при клике на кнопку выход со ссылкой index.php?exit=1
происходил переход на страницу, удалялся $_SERVER['PHP_AUTH_DIGEST'], и затем происходил переход на index.php, так как при вводе логина и пароля с index.php?exit=1 они тут же удаляются.
Без хедера и эксита удалялся $_SERVER['PHP_AUTH_DIGEST'] нормально, а с хедером-переходом - происходит переход, а данные не удаляются почему-то.
-----------------
Это начало документа

<?php
if (isset($_GET['exit'])) {
$exit=intval(trim($_GET['exit']));
if ($exit!='') {
unset($_SERVER['PHP_AUTH_DIGEST'], $auth_name);
header('Location: index.php');
exit;
};
};
...


Весь код тут:
index.php:
<?php include ("lock.php"); ?>

lock.php:
<?php
if (isset($_GET['exit'])) {
$exit=intval(trim($_GET['exit']));
if ($exit!='') {
unset($_SERVER['PHP_AUTH_DIGEST'], $auth_name);
header('Location: index.php');
exit;
};
};
include ('../blocks/db_action.php');
$realm = "Administrator Panel";
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header("WWW-Authenticate: Digest realm='".$realm."',qop='auth',nonce='".uniqid()."',opaque='".md5($realm)."'");
die("Authorisation failed <a href='/index.php'>To the site</a> <a href='/admin/index.php'>Authorise</a>");
}

//user => password
$user_db = @mysql_query("SELECT `pass`, `user` FROM `userlist`", $db) or die();
if (mysql_num_rows($user_db) >0) {
$user = mysql_fetch_array($user_db);
do $users[$user['user']]=$user['pass'];
while($user = mysql_fetch_array($user_db));
unset($user_db,$user);
};

// анализируем переменную PHP_AUTH_DIGEST
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || !isset($users[$data['username']])) {
unset($_SERVER['PHP_AUTH_DIGEST']);
header('HTTP/1.1 401 Unauthorized');
header("WWW-Authenticate: Digest realm='".$realm."',qop='auth',nonce='".uniqid()."',opaque='".md5($realm)."'");
};

// генерируем корректный ответ
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
unset($users);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

if ($data['response'] != $valid_response) {
unset($_SERVER['PHP_AUTH_DIGEST']);
header('HTTP/1.1 401 Unauthorized');
header("WWW-Authenticate: Digest realm='".$realm."',qop='auth',nonce='".uniqid()."',opaque='".md5($realm)."'");
};
// ok, логин и пароль верны
$auth_name = $data['username'];


// функция разбора заголовка http auth
function http_digest_parse($txt)
{
// защита от отсутствующих данных
$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
$data = array();
$keys = implode('|', array_keys($needed_parts));

preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

foreach ($matches as $m) {
$data[$m[1]] = $m[3] ? $m[3] : $m[4];
unset($needed_parts[$m[1]]);
}

return $needed_parts ? false : $data;
};
?>

Примечание:
Сделал в итоге так:

<?php
if (isset($_GET['exit'])) {
$exit=intval(trim($_GET['exit']));
if ($_GET['exit']==1) {
header('HTTP/1.1 401 Unauthorized');
echo "<meta http-equiv='refresh' content='0; url=/admin/' />";
exit();
};
};
.....
Если вместо echo "<meta http-equiv='refresh' content='0; url=/admin/' />"; вставить php header('Location: /admin/'); - не работает почему-то. Спасибо огромное!
Ответы:
От сброса PHP_AUTH_DIGEST эффекта не будет.
"Без хедера и эксита удалялся $_SERVER['PHP_AUTH_DIGEST'] нормально..." - получается, что после unset скрипт продолжает выполняться и доходя до условия, отправляет серверу код 401:
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
  header('HTTP/1.1 401 Unauthorized');
  ...
}


10 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.