Сбой сеанса PHP на кнопке выхода

В настоящее время я работаю над сайтом, на котором есть вход (имя пользователя и пароль). Защита паролем выполняется операционной системой внутри веб-сервера на уровне папок под названием Realm в ОС. Пока это нужно будет сделать, пока мы не выясним правильную систему регистрации PHP.

Код ниже, основан на предыдущем вопросе о переполнении стека.

Я использую 3 файла (см. Фрагменты кода внизу).

Процесс: – Нажмите кнопку «Вход» на index.php – введите имя пользователя и пароль для доступа к файлу индекса аутентификации. – Нажмите кнопку выхода из системы, которая ссылается на файл logout.php – СЛЕДУЕТ очистить кеш и вернуть пользователя в индекс верхнего уровня.

Он не «разрушает сеанс» в том смысле, что вам не предлагается повторно вводить пароль при появлении запроса, что по сути является тем, что я хочу.

Мое минимальное знание php оставляет меня немного в тупике.

index.php (файл верхнего уровня с кнопкой входа в систему)

<?php session_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Test</title> </head> <body> <a href="authenticate/index.php">Log In Btn</a> </body> </html> 

authenticate / index.php (эта папка защищена паролем – содержит индексный файл с кнопкой выхода из системы, которая ссылается на файл logout.php)

 <?php session_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Log out</title> </head> <body> <a href="logout.php">Log Out Btn</a> </body> </html> 

аутентификации / logout.php

 <?php session_start(); //to ensure you are using same session session_destroy(); //destroy the session header("location:/index.php"); //to redirect back to "index.php" after logging out exit(); ?> 

Папка, защищенная паролем, не имеет ничего общего с PHP!

Используемый метод называется «Базовая аутентификация». Не существует сквозных способов «выхода из системы», кроме как попросить пользователя закрыть, а затем открыть браузер.

Вот как вы могли бы сделать это в PHP вместо этого (полностью удалите свой Apache basic auth в .htaccess или где бы он ни был первым):

login.php:

 <?php session_start(); //change 'valid_username' and 'valid_password' to your desired "correct" username and password if (! empty($_POST) && $_POST['user'] === 'valid_username' && $_POST['pass'] === 'valid_password') { $_SESSION['logged_in'] = true; header('Location: /index.php'); } else { ?> <form method="POST"> Username: <input name="user" type="text"><br> Password: <input name="pass" type="text"><br><br> <input type="submit" value="submit"> </form> <?php } 

index.php

 <?php session_start(); if (! empty($_SESSION['logged_in'])) { ?> <p>here is my super-secret content</p> <a href='logout.php'>Click here to log out</a> <?php } else { echo 'You are not logged in. <a href="login.php">Click here</a> to log in.'; } 

logout.php:

 <?php session_start(); session_destroy(); echo 'You have been logged out. <a href="/">Go back</a>'; 

Очевидно, что это очень простая реализация. Вы ожидали, что имена пользователей и пароли будут находиться в базе данных, а не в виде жесткого сравнения. Я просто пытаюсь дать вам представление о том, как делать сеанс.

Надеюсь, это поможет вам понять, что происходит.

Сначала logout.php ссылку на страницу logout.php в этой кнопке выхода. На этой странице введите код, который приведен ниже:

Вот код:

 <?php session_start(); session_destroy(); ?> 

Когда сеанс запущен, сеанс для последнего / текущего пользователя запущен, поэтому не нужно объявлять имя пользователя. Он будет автоматически удален методом session_destroy.