За последние 24 часа нас посетили 17664 программиста и 1614 роботов. Сейчас ищут 1819 программистов ...

Зацикливание страницы(не работает редирект)

Тема в разделе "PHP для новичков", создана пользователем RoffDaniel, 13 май 2018.

  1. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    Всем снова привет. Появилась проблема, которую я не могу никак решить, это капец...
    Вот код моего index.php:
    PHP:
    1. if(!isset($_GET['page']) || $_GET['page'] == 'index')
    2. {
    3.     include 'site-system/includes/page/index.php';
    4. }
    5. else if(!isset($_GET['page']) || $_GET['page'] == 'blacklist')
    6. {
    7.     //include '../system-files-script/bd-connection.php';
    8.     include 'site-system/includes/page/blacklist.php';
    9. }
    10. else if(!isset($_GET['page']) || $_GET['page'] == 'whitelist')
    11. {
    12.     include 'site-system/includes/page/whitelist.php';
    13. }
    14. else if(!isset($_GET['page']) || $_GET['page'] == 'install')
    15. {
    16.     include 'site-system/includes/page/install.php';
    17. }
    18. else if(!isset($_GET['page']) || $_GET['page'] == 'stats')
    19. {
    20.     include 'site-system/includes/page/stats.php';
    21. }
    22. else if(!isset($_GET['page']) || $_GET['page'] == 'about-us')
    23. {
    24.     include 'site-system/includes/page/about-us.php';
    25. }
    26. else if(!isset($_GET['page']) || $_GET['page'] == 'login')
    27. {
    28.     include 'site-system/includes/page/login.php';
    29. }
    30. else if(!isset($_GET['page']) || $_GET['page'] == 'panel')
    31. {
    32.     if (isset($_SESSION['logged_user']))
    33.     {
    34.         if($_GET['action'] == 'info')
    35.         {
    36.             include 'site-system/includes/page/panel/info.php';
    37.         }
    38.         else
    39.         {
    40.             include 'site-system/errors/page-error.php';
    41.         }
    42.     }
    43.     else
    44.     {
    45.         header('Status: 301 Moved Permanently', false, 301);
    46.         header('Location: /login/');
    47.     }
    48. }
    49. else if(!isset($_GET['page']) || $_GET['page'] == 'logout')
    50. {
    51.     session_unset($_SESSION['server']);
    52.     session_unset($_SESSION['logged_user']);
    53.     header('Location: /', true, 301);
    54. }
    55. else
    56. {
    57.     include 'site-system/errors/page-error.php';
    58. }
    Данный код я использую для того что бы не создавать каждый раз отдельную страницу, а просто подгружаю ее сюда. НО!.... Когда я хочу выйти из аккаунта, я отправляю пользователя на путь «domain.com/logout/», где использую код:

    PHP:
    1. else if(!isset($_GET['page']) || $_GET['page'] == 'logout')
    2. {
    3.     session_unset($_SESSION['server']);
    4.     session_unset($_SESSION['logged_user']);
    5.     header('Location: /', true, 301);
    6. }
    То есть, должно уничтожать сессию, что оно и делает, и редиректить на главную страницу, но вот проблема. Когда пользователь пытается выйти, его переносить на домен «domain.com/logout/», и там же ОСТАЕТСЯ! Редирект почему-то не происходит, а оставляет на странице. Если нажать «F5», то редирект прозойдет....

    Я не знаю почему так, дня два с этим воюю... Помогите пожалуйста решить проблему.
    Зарнее, спасибо!
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    а где session_start(); ?
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @RoffDaniel, для начала поставьте exit; после header('location...');
    Затем уточните, что-же должно выполняться, если действительно !isset($_GET['page']).
     
  4. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    При подключении БД, в другом файле, но оно есть...
    --- Добавлено ---
    Ошибка страницы, а что?
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    То есть "Страница ошибки"? Или, как сейчас: index.php?
    И зачем этот !isset(...) в каждом "ветвлении"?
    Раз уж при отсутствии параметра page выводится index, то к моменту выполнения остальных elseif() уже ясно, что этот параметр определен.
     
  6. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    Вот я заснял проблему, прошу посмотреть(Не реклама!):
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @RoffDaniel, exit; после header('location') добавили?!
     
  8. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    Да
     
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Подробнее, пожалуйста, каким образом выполняете эту "отправку"?
     
  10. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    HTML:
    1. <a class="dropdown-item waves-effect waves-light" href="/logout/"><i class="fa fa-sign-out-alt mr-1"></i>Выйти</a>
    Вот так.
     
  11. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Следовательно, исходя из кода в первом сообщении можно сделать вывод, что попадаем в первое ветвление... на index.php, потому что параметр get не задан.
    Гляньте, что выведет var_dump($_GET) после перехода по этой ссылке.
     
  12. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    PHP:
    1. {
    2.   ["page"]=>
    3.   string(6) "logout"
    4. }
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @RoffDaniel, в логах случайно фраза "Warning: Cannot add header information - headers already sent" не встречается?
     
  14. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    Вроде нет.
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Тебе подсказали в начале запусти сессию
    PHP:
    перед
    PHP:
    1.  session_unset($_SESSION['server']);
    2. session_unset($_SESSION['logged_user']);
    и все станет на свои места.
    Пример если не понял:
    PHP:
    1. else if(!isset($_GET['page']) || $_GET['page'] == 'logout')
    2. {
    3.     session_start();
    4.     session_unset($_SESSION['server']);
    5.     session_unset($_SESSION['logged_user']);
    6.     header('Location: /', true, 301);
    7.     exit("вы вышли из аккаунта");
    8. }
     
  16. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    utf8 without bom везде? Точно ничего перед хедером не отправляешь? может что то там где у тебя старт сессии?
    PHP:
    1. ini_set('display_errors', 1);
    2. ini_set('display_startup_errors', 1);
    --- Добавлено ---
    Можно поступить как тру пихапист. Если нет сессии сделать повторный редирект)
    --- Добавлено ---
    Вот оно как по тру будет)
    PHP:
    1. header('Location: /',true,301);
     
  17. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    Снова начать сессию? Она у меня просто начинается в другом месте.
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    ты попробовал как я показал или нет? скопировать код надеюсь можешь. Да сессию при уничтожении сессионых данных нужно запускать, даже если ты ее запускаешь в другом файле.
    Но вроде бы это действует только тогда когда ты уничтожаешь всю сессию и все данные с нее.
    И все же если у тебя есть единая точка входа, и ты там запускаешь сессию, то при уничтожении и выход из сайта, тебе не нужно запускать сессию, остается просто уничтожить ее и все.
     
    #18 _ne_scaju_, 16 май 2018
    Последнее редактирование: 16 май 2018
  19. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    Понял, спасибо. Но ситуация не изменилась. НО, порывшись глубже, я наткнулся на такую вот тему: https://php.ru/forum/threads/problema-header-location.39911/
    или
    https://ru.stackoverflow.com/questions/152031/Не-работает-header

    Но полностью понять не могу...
    --- Добавлено ---
    Что в моем случае есть не правильным??
    --- Добавлено ---
    Вот еще пример. Если ввести «domain.com/panel/», и если ты не авторизован, то тебя редиректнет на страницу авторизации, в прицепе как сдесь:

    PHP:
    1. else if(!isset($_GET['page']) || $_GET['page'] == 'panel')
    2. {
    3.     if (isset($_SESSION['logged_user']))
    4.     {
    5.         if($_GET['action'] == 'info')
    6.         {
    7.             include 'site-system/includes/page/panel/info.php';
    8.         }
    9.         else if($_GET['action'] == 'settings')
    10.         {
    11.             include 'site-system/includes/page/panel/settings.php';
    12.         }
    13.         else
    14.         {
    15.             include 'site-system/errors/page-error.php';
    16.         }
    17.     }
    18.     else
    19.     {
    20.         header('Status: 301 Moved Permanently', false, 301);
    21.         header('Location: /login/');
    22.     }
    23. }
    Но почему-то во время выхода, редирект не пашет(
     
  20. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Попробуй вот так, копируй весь код:
    PHP:
    1. <?php
    2. if(!isset($_GET['page']) && $_GET['page'] == 'index')
    3. {
    4.     include 'site-system/includes/page/index.php';
    5. }
    6. else if(!isset($_GET['page']) && $_GET['page'] == 'blacklist')
    7. {
    8.     include 'site-system/includes/page/blacklist.php';
    9. }
    10. else if(!isset($_GET['page']) && $_GET['page'] == 'whitelist')
    11. {
    12.     include 'site-system/includes/page/whitelist.php';
    13. }
    14. else if(!isset($_GET['page']) && $_GET['page'] == 'install')
    15. {
    16.     include 'site-system/includes/page/install.php';
    17. }
    18. else if(!isset($_GET['page']) && $_GET['page'] == 'stats')
    19. {
    20.     include 'site-system/includes/page/stats.php';
    21. }
    22. else if(!isset($_GET['page']) && $_GET['page'] == 'about-us')
    23. {
    24.     include 'site-system/includes/page/about-us.php';
    25. }
    26. else if(!isset($_GET['page']) && $_GET['page'] == 'login')
    27. {
    28.     include 'site-system/includes/page/login.php';
    29. }
    30. else if(!isset($_GET['page']) && $_GET['page'] == 'panel')
    31. {
    32.     if (isset($_SESSION['logged_user']))
    33.     {
    34.         if($_GET['action'] == 'info')
    35.         {
    36.             include 'site-system/includes/page/panel/info.php';
    37.         }
    38.         else
    39.         {
    40.             include 'site-system/errors/page-error.php';
    41.         }
    42.     }
    43.     else
    44.     {
    45.         header('Status: 301 Moved Permanently', false, 301);
    46.         header('Location: /login/');
    47.     }
    48. }
    49. else if(!isset($_GET['page']) && $_GET['page'] == 'logout')
    50. {
    51.     if (isset($_SESSION['logged_user']))
    52.     {
    53.         session_start();
    54.         session_destroy();
    55.         unset($_SESSION['server']);
    56.         unset($_SESSION['logged_user']);  
    57.         header('Location: /', true, 301);
    58.         exit('чтож, вы вышли из аккаунта.');
    59.     }
    60. }
    61. else
    62. {
    63.     include 'site-system/errors/page-error.php';
    64. }
    Надеюсь сработает.
     
  21. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    Сказали бы, чтобы я добавил поменял на "&&", но, я пробовал, и мне выдает страницу ошибки "page.error"...
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    чего ты хочешь добиться в этом условии?
    PHP:
    1. if(!isset($_GET['page']) || $_GET['page'] == 'index')
    меня интересует || что ты проверяешь этим? Какое условие у тебя должно стоять? ИЛИ ИЛИ-НЕ и т. д.
    Ты код весь копировал? или просто изменил знаки && ?
    Ошибку выдает на всех ссылках?
     
  23. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @_ne_scaju_, только отрицание при проверке наличия $_GET['page'] убрать, если уж менять 'или' на 'и' :)
    @RoffDanielб, в первом сравнении - или вполне уместно, а вот в последующих, раз уж всё равно написан elseif, то !isset() - лишний.
     
    _ne_scaju_ нравится это.
  24. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Все еще обсуждаете. Ты отображение ошибок включил? Через дев тулз посмотрел какие хедеры приходят? Место где они перестают устанавливаться нашел? Подобные проблемы решаются за минуты но ни как не 3 дня.
    --- Добавлено ---
    Вот что пришло в голову. Возможно у тебя просто есть закрывающий php тег с пробелами в том месте где ты инклюдишь сессию. Потому и хедеры не ставятся
     
    _ne_scaju_ нравится это.
  25. RoffDaniel

    RoffDaniel Новичок

    С нами с:
    10 май 2018
    Сообщения:
    18
    Симпатии:
    0
    Вот что показывает, но к сожалению, я не понимаю в этом пока ничего, впервые с такой проблемой сталкиваюсь(