Переход между страницами: примеры и инструкции для PHP

Раздел: Разработка веб-страниц -> Навигация между страницами

Основные методы редиректа в PHP

Как осуществить безусловное перенаправление на другую страницу?

Самый надёжный способ - использование функции header() с указанием заголовка Location, после которого обязательно вызывается exit.


<?php
header('Location: https://example.com/new-page');
exit;
?>
  

Пояснения: функция header() отправляет HTTP-заголовок, сообщая браузеру о новом адресе. exit предотвращает выполнение дальнейшего кода. Обратите внимание на абсолютный или относительный путь.

Цель: немедленный редирект после обработки данных или при условии. Используется в 90% случаев.

Как выполнить редирект с задержкой и уведомлением?

Если требуется показать сообщение перед перенаправлением, применяется JavaScript или мета-тег.

Вариант с JavaScript


<?php
echo '<script>window.location.href='https://example.com/next';</script>';
?>
  

Этот способ сработает, если вывод не блокируется. Однако он ненадёжен при отключённом JavaScript.

Вариант с meta refresh


<?php
echo '<meta http-equiv='refresh' content='2;url=https://example.com/next'>';
?>
  

Позволяет задать задержку в секундах (2). Используется для страниц с сообщением об успехе.

Как перенаправить внутри одного сайта с передачей параметров?


<?php
header('Location: /profile.php?user_id=' . urlencode($userId));
exit;
?>
  

Параметры необходимо кодировать с помощью urlencode(), чтобы избежать ошибок из-за специальных символов.

Как выполнить редирект после успешной авторизации?


<?php
session_start();
if (login($username, $password)) {
    $_SESSION['user'] = $username;
    header('Location: dashboard.php');
    exit;
}
?>
  

После проверки учётных данных устанавливается сессия, затем редирект.

Как перенаправить на предыдущую страницу?


<?php
if (isset($_SERVER['HTTP_REFERER'])) {
    $redirect = $_SERVER['HTTP_REFERER'];
} else {
    $redirect = '/index.php';
}
header('Location: ' . $redirect);
exit;
?>
  

Используется HTTP-заголовок Referer. Не всегда надёжен (может отсутствовать).

Как сделать редирект в рамках фреймворка Laravel?


// В контроллере
return redirect('/dashboard');
// или с параметрами
return redirect()->route('posts.show', ['id' => $postId]);
  

Фреймворк автоматически добавляет заголовки и завершает выполнение.

Типичные ошибки и их решение

Ошибка: "Cannot modify header information - headers already sent"

Причина: любой вывод (echo, пробелы, HTML) до вызова header() уже отправил заголовки. Решения:

  • Убедиться, что перед header() нет вывода.
  • Использовать буферизацию: ob_start() в начале скрипта.
  • Перенести логику редиректа до любого вывода.
  • Использовать header() внутри функций, но до вывода.

<?php
ob_start();
// какой-то код
header('Location: destination.php');
exit;
ob_end_flush();
?>
  

Дополнительные примеры и редкие техники редиректа

Пример 1: Редирект с HTTP-статусом 301 (постоянный)

Пример

<?php
header('HTTP/1.1 301 Moved Permanently');
header('Location: https://example.com/new-location');
exit;
?>
  
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-location
Браузер запоминает новый адрес и в будущем обращается сразу к нему.
  

Пример 2: Редирект с использованием сессионного флеш-сообщения

Пример

<?php
session_start();
$_SESSION['flash'] = 'Изменения сохранены.';
header('Location: /success.php');
exit;
?>
  
На странице success.php можно вывести и удалить сообщение:
<?php if (isset($_SESSION['flash'])): ?>
  <p><?= $_SESSION['flash']; ?></p>
  <?php unset($_SESSION['flash']); endif; ?>
  

Пример 3: Редирект с проверкой на AJAX-запрос

Пример

<?php
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
    // AJAX запрос - возвращаем JSON
    echo json_encode(['redirect' => '/new-page']);
    exit;
}
// Обычный запрос - редирект
header('Location: /new-page');
exit;
?>
  
Для AJAX браузер получит JSON, который JavaScript интерпретирует для редиректа.
Для обычного запроса - стандартный HTTP редирект.
  

Пример 4: Редирект с использованием буферизации и очистки вывода

Пример

<?php
ob_start();
echo 'Этот текст не должен быть отправлен до редиректа.';
header_remove('Content-Type');
header('Location: /new-location');
ob_end_clean();
exit;
?>
  
Скрипт не выведет текст, а выполнит редирект. ob_end_clean() уничтожает буфер, предотвращая отправку ненужных данных.
  

Пример 5: Редирект в зависимости от времени суток

Пример

<?php
$hour = (int) date('G');
if ($hour >= 8 && $hour < 18) {
    header('Location: /daymode.php');
} else {
    header('Location: /nightmode.php');
}
exit;
?>
  
Пользователь будет перенаправлен на дневную или ночную версию сайта.
  

Пример 6: Редирект с использованием абсолютного URL на основе текущего протокола

Пример

<?php
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://';
$host = $_SERVER['HTTP_HOST'];
$newPath = '/secure-area';
header('Location: ' . $protocol . $host . $newPath);
exit;
?>
  
Формируется полный URL с учётом протокола (HTTP/HTTPS).
  

Переход на другую страницу в PHP - comments

En
Php на другую страницу (php)