Всем снова привет. Появилась проблема, которую я не могу никак решить, это капец... Вот код моего index.php: PHP: if(!isset($_GET['page']) || $_GET['page'] == 'index') { include 'site-system/includes/page/index.php'; } else if(!isset($_GET['page']) || $_GET['page'] == 'blacklist') { //include '../system-files-script/bd-connection.php'; include 'site-system/includes/page/blacklist.php'; } else if(!isset($_GET['page']) || $_GET['page'] == 'whitelist') { include 'site-system/includes/page/whitelist.php'; } else if(!isset($_GET['page']) || $_GET['page'] == 'install') { include 'site-system/includes/page/install.php'; } else if(!isset($_GET['page']) || $_GET['page'] == 'stats') { include 'site-system/includes/page/stats.php'; } else if(!isset($_GET['page']) || $_GET['page'] == 'about-us') { include 'site-system/includes/page/about-us.php'; } else if(!isset($_GET['page']) || $_GET['page'] == 'login') { include 'site-system/includes/page/login.php'; } else if(!isset($_GET['page']) || $_GET['page'] == 'panel') { if (isset($_SESSION['logged_user'])) { if($_GET['action'] == 'info') { include 'site-system/includes/page/panel/info.php'; } else { include 'site-system/errors/page-error.php'; } } else { header('Status: 301 Moved Permanently', false, 301); header('Location: /login/'); } } else if(!isset($_GET['page']) || $_GET['page'] == 'logout') { session_unset($_SESSION['server']); session_unset($_SESSION['logged_user']); session_destroy(); header('Location: /', true, 301); } else { include 'site-system/errors/page-error.php'; } Данный код я использую для того что бы не создавать каждый раз отдельную страницу, а просто подгружаю ее сюда. НО!.... Когда я хочу выйти из аккаунта, я отправляю пользователя на путь «domain.com/logout/», где использую код: PHP: else if(!isset($_GET['page']) || $_GET['page'] == 'logout') { session_unset($_SESSION['server']); session_unset($_SESSION['logged_user']); session_destroy(); header('Location: /', true, 301); } То есть, должно уничтожать сессию, что оно и делает, и редиректить на главную страницу, но вот проблема. Когда пользователь пытается выйти, его переносить на домен «domain.com/logout/», и там же ОСТАЕТСЯ! Редирект почему-то не происходит, а оставляет на странице. Если нажать «F5», то редирект прозойдет.... Я не знаю почему так, дня два с этим воюю... Помогите пожалуйста решить проблему. Зарнее, спасибо!
@RoffDaniel, для начала поставьте exit; после header('location...'); Затем уточните, что-же должно выполняться, если действительно !isset($_GET['page']).
То есть "Страница ошибки"? Или, как сейчас: index.php? И зачем этот !isset(...) в каждом "ветвлении"? Раз уж при отсутствии параметра page выводится index, то к моменту выполнения остальных elseif() уже ясно, что этот параметр определен.
HTML: <a class="dropdown-item waves-effect waves-light" href="/logout/"><i class="fa fa-sign-out-alt mr-1"></i>Выйти</a> Вот так.
Следовательно, исходя из кода в первом сообщении можно сделать вывод, что попадаем в первое ветвление... на index.php, потому что параметр get не задан. Гляньте, что выведет var_dump($_GET) после перехода по этой ссылке.
@RoffDaniel, в логах случайно фраза "Warning: Cannot add header information - headers already sent" не встречается?
Тебе подсказали в начале запусти сессию PHP: session_start(); перед PHP: session_unset($_SESSION['server']); session_unset($_SESSION['logged_user']); session_destroy(); и все станет на свои места. Пример если не понял: PHP: else if(!isset($_GET['page']) || $_GET['page'] == 'logout') { session_start(); session_unset($_SESSION['server']); session_unset($_SESSION['logged_user']); session_destroy(); header('Location: /', true, 301); exit("вы вышли из аккаунта"); }
utf8 without bom везде? Точно ничего перед хедером не отправляешь? может что то там где у тебя старт сессии? PHP: ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); --- Добавлено --- Можно поступить как тру пихапист. Если нет сессии сделать повторный редирект) --- Добавлено --- Вот оно как по тру будет) PHP: session_start(); session_destroy(); session_start(); session_regenerate_id(TRUE); header('Location: /',true,301);
ты попробовал как я показал или нет? скопировать код надеюсь можешь. Да сессию при уничтожении сессионых данных нужно запускать, даже если ты ее запускаешь в другом файле. Но вроде бы это действует только тогда когда ты уничтожаешь всю сессию и все данные с нее. И все же если у тебя есть единая точка входа, и ты там запускаешь сессию, то при уничтожении и выход из сайта, тебе не нужно запускать сессию, остается просто уничтожить ее и все.
Понял, спасибо. Но ситуация не изменилась. НО, порывшись глубже, я наткнулся на такую вот тему: https://php.ru/forum/threads/problema-header-location.39911/ или https://ru.stackoverflow.com/questions/152031/Не-работает-header Но полностью понять не могу... --- Добавлено --- Что в моем случае есть не правильным?? --- Добавлено --- Вот еще пример. Если ввести «domain.com/panel/», и если ты не авторизован, то тебя редиректнет на страницу авторизации, в прицепе как сдесь: PHP: else if(!isset($_GET['page']) || $_GET['page'] == 'panel') { if (isset($_SESSION['logged_user'])) { if($_GET['action'] == 'info') { include 'site-system/includes/page/panel/info.php'; } else if($_GET['action'] == 'settings') { include 'site-system/includes/page/panel/settings.php'; } else { include 'site-system/errors/page-error.php'; } } else { header('Status: 301 Moved Permanently', false, 301); header('Location: /login/'); } } Но почему-то во время выхода, редирект не пашет(
Попробуй вот так, копируй весь код: Спойлер: Код тут, держи. PHP: <?php if(!isset($_GET['page']) && $_GET['page'] == 'index') { include 'site-system/includes/page/index.php'; } else if(!isset($_GET['page']) && $_GET['page'] == 'blacklist') { include 'site-system/includes/page/blacklist.php'; } else if(!isset($_GET['page']) && $_GET['page'] == 'whitelist') { include 'site-system/includes/page/whitelist.php'; } else if(!isset($_GET['page']) && $_GET['page'] == 'install') { include 'site-system/includes/page/install.php'; } else if(!isset($_GET['page']) && $_GET['page'] == 'stats') { include 'site-system/includes/page/stats.php'; } else if(!isset($_GET['page']) && $_GET['page'] == 'about-us') { include 'site-system/includes/page/about-us.php'; } else if(!isset($_GET['page']) && $_GET['page'] == 'login') { include 'site-system/includes/page/login.php'; } else if(!isset($_GET['page']) && $_GET['page'] == 'panel') { if (isset($_SESSION['logged_user'])) { if($_GET['action'] == 'info') { include 'site-system/includes/page/panel/info.php'; } else { include 'site-system/errors/page-error.php'; } } else { header('Status: 301 Moved Permanently', false, 301); header('Location: /login/'); } } else if(!isset($_GET['page']) && $_GET['page'] == 'logout') { if (isset($_SESSION['logged_user'])) { session_start(); session_destroy(); unset($_SESSION['server']); unset($_SESSION['logged_user']); header('Location: /', true, 301); exit('чтож, вы вышли из аккаунта.'); } } else { include 'site-system/errors/page-error.php'; } Надеюсь сработает.
Сказали бы, чтобы я добавил поменял на "&&", но, я пробовал, и мне выдает страницу ошибки "page.error"...
чего ты хочешь добиться в этом условии? PHP: if(!isset($_GET['page']) || $_GET['page'] == 'index') меня интересует || что ты проверяешь этим? Какое условие у тебя должно стоять? ИЛИ ИЛИ-НЕ и т. д. Ты код весь копировал? или просто изменил знаки && ? Ошибку выдает на всех ссылках?
@_ne_scaju_, только отрицание при проверке наличия $_GET['page'] убрать, если уж менять 'или' на 'и' @RoffDanielб, в первом сравнении - или вполне уместно, а вот в последующих, раз уж всё равно написан elseif, то !isset() - лишний.
Все еще обсуждаете. Ты отображение ошибок включил? Через дев тулз посмотрел какие хедеры приходят? Место где они перестают устанавливаться нашел? Подобные проблемы решаются за минуты но ни как не 3 дня. --- Добавлено --- Вот что пришло в голову. Возможно у тебя просто есть закрывающий php тег с пробелами в том месте где ты инклюдишь сессию. Потому и хедеры не ставятся
Вот что показывает, но к сожалению, я не понимаю в этом пока ничего, впервые с такой проблемой сталкиваюсь(