Переход между страницами: примеры и инструкции для 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).