Почему страница все еще загружается после редиректа? [дубликат]

Вопрос или проблема

У меня есть странная проблема, и я не могу понять, что вызывает такое поведение.

У меня есть страница под названием dashboard.php, где я использую следующий код:

mail('[email protected]', 'Dashboard 1', 'isLoggedin = ' . $isLoggedIn);

if(!$isLoggedIn) {
  header("Location: https://example.com/account/login.php");
}

mail('[email protected]', 'Dashboard 2', 'Dashboard 2');

Если пользователь не вошел в систему на странице dashboard.php, он должен быть перенаправлен на страницу login.php.

Когда я не вошел в систему и перешел на dashboard.php, произошло следующее:

  1. Я получил первое письмо, где isLoggedin пустое (что, конечно, верно)
  2. Я был перенаправлен на страницу login.php, что тоже правильно
  3. Я получил второе письмо ‘Dashboard 2’, которое я не понимаю.

Почему я получаю второе письмо, если меня перенаправляют на login.php, так что скрипт в dashboard.php не должен выполняться дальше? Почему скрипт после редиректа все еще работает?

Попробуйте использовать exit(); или die();, чтобы завершить рендеринг страницы и перейти к заголовку. Это может быть решением.

Die в PHP

Exit в PHP

Как указано в документации php.net, вам нужно exit; вашего скрипта, в противном случае он будет выполняться.

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что PHP не завершает выполнение скрипта после вызова функции header("Location: ..."). Когда вы отправляете заголовок для перенаправления, PHP не прекращает выполнение текущего скрипта автоматически, и любые строки кода, которые следуют за этим вызовом, будут продолжать выполняться.

В вашем случае, несмотря на то что происходит перенаправление на страницу login.php, код, который отправляет второе письмо, всё равно выполняется, поскольку после вызова header отсутствует команда, завершающая выполнение скрипта. Поэтому стоит добавить exit(); или die(); после вызова header, чтобы послать заголовок и прекратить выполнение текущего скрипта.

Исправленный код:

mail('<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f1898989b1969c90989ddf929e9c">[email protected]</a>', 'Dashboard 1', 'isLoggedin = ' . $isLoggedIn);

if(!$isLoggedIn) {
    header("Location: https://example.com/account/login.php");
    exit(); // Завершение выполнения скрипта
}

mail('<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8af2f2f2caede7ebe3e6a4e9e5e7">[email protected]</a>', 'Dashboard 2', 'Dashboard 2');

Почему это важно:

  1. Понимание потока выполнения: Уведомления отправляются и код после header выполняется, потому что PHP не понимает, что после HTTP заголовков (например, Location) нужно остановиться.
  2. Избежание ошибок: Если в вашем коде есть условия, по которым должно происходить перенаправление, но код всё равно выполняется далее, это может привести к ошибкам или несанкционированным действиям, как в вашем случае с отправкой второго письма.

В добавление, стоит отметить, что использование exit или die не только предотвращает выполнение оставшегося кода, но и очищает любые аварийные условия, которые могут возникнуть, когда сервер пытается обработать дополнительные действия (например, отправка заголовков после начала вывода). Это является хорошей практикой при использовании перенаправлений в PHP.

Также, всегда стоит проверять, что перед вызовом header не было выведено никакого контента, так как это приведет к ошибке headers already sent. Это является частой ошибкой при работе с заголовками в PHP.

Оцените материал
Добавить комментарий

Капча загружается...