Как выполнить редирект на другую страницу через PHP
Основной способ редиректа: функция header() с завершением выполнения
Самым распространенным и правильным решением для редиректа в PHP является использование функции header() для отправки HTTP-заголовка Location, после чего следует немедленно завершить выполнение скрипта с помощью exit или die. Этот метод гарантирует, что клиент получит только заголовок перенаправления и не будет продолжать обрабатывать остальной вывод.
<?php
header('Location: https://example.com/new-page');
exit;
?>
Пояснение: вызов header('Location: URL') устанавливает HTTP-заголовок, указывающий браузеру перейти на другой адрес. По умолчанию используется статус 302 (временный редирект). Команда exit останавливает выполнение PHP, чтобы избежать случайного вывода дополнительных данных, которые могут нарушить работу перенаправления.
Типичные проблемы и ошибки:
- Вывод любого текста или HTML до вызова header() приводит к ошибке «headers already sent». Решение – убедиться, что перед header() нет пробелов, пустых строк или вывода.
- Отсутствие exit после header() может привести к выполнению последующего кода и частичному выводу, который помешает редиректу.
- Неправильный URL (без схемы http:// или https://) может интерпретироваться как относительный путь.
Цель использования: быстрый и надежный серверный редирект, когда требуется перенаправить пользователя на другую страницу в ответ на GET-запрос или после обработки формы.
Как сделать редирект с указанием HTTP-статуса (301, 302, 303)?
Добавьте второй заголовок с кодом статуса перед Location:
<?php
http_response_code(301); // постоянный редирект
header('Location: https://example.com/permanent');
exit;
?>
Статусы: 301 – страница перемещена навсегда, 302 – найдено (временный), 303 – смотри другое (используется после POST).
Ошибка: неверный порядок заголовков – сначала должен идти статус, затем Location. Или можно использовать header('Location: ...', true, 301).
Как выполнить редирект через meta refresh (HTML)?
Этот вариант применяется, когда нельзя использовать PHP-заголовки (например, если уже был вывод). Тогда в HTML вставляется мета-тег:
<?php
echo '<meta http-equiv="refresh" content="0; url=https://example.com">';
exit;
?>
Параметр content: '0' – задержка в секундах (0 для мгновенного). Редирект происходит на стороне браузера, а не сервера.
Недостатки: медленнее, чем header(); работает только при включенном HTML; не передает серверный статус.
Как сделать редирект через JavaScript?
Альтернатива – использовать window.location в случае, когда предыдущие методы недоступны:
<?php
echo '<script>window.location.href = "https://example.com";</script>';
exit;
?>
Этот метод также выполняется на клиенте, но может быть заблокирован некоторыми настройками безопасности браузера.
Проблема: если у пользователя отключен JavaScript, редирект не сработает. Также не передается HTTP-статус.
Как организовать редирект только для определенных условий (авторизация, IP)?
Условная конструкция:
<?php
if (!isset($_SESSION['user'])) {
header('Location: /login.php');
exit;
}
// дальнейший код для авторизованных
?>
Здесь редирект выполняется только если пользователь не авторизован.
Как выполнить редирект с помощью WordPress (wp_redirect)?
В WordPress существует встроенная функция:
<?php
wp_redirect('https://example.com', 301);
exit;
?>
Она автоматически обрабатывает заголовки и статусы, но должна использоваться до любого вывода.
Ошибка: вызов wp_redirect после вывода контента приведет к ошибке «headers already sent».
Дополнительные расширенные примеры редиректов в PHP
Пример 1: Редирект с сохранением GET-параметров
Перенаправление на другой домен, передавая все текущие GET-параметры:
<?php
$query = http_build_query($_GET);
$redirect = 'https://other-site.com/page?' . $query;
header('Location: ' . $redirect);
exit;
?>
Если текущий URL /old.php?key=value&id=5, то произойдет редирект на https://other-site.com/page?key=value&id=5
Пример 2: Условный редирект по времени суток
В рабочее время показывать одну страницу, в нерабочее – другую:
<?php
$hour = (int)date('G');
if ($hour >= 9 && $hour < 18) {
header('Location: /business-hours');
} else {
header('Location: /after-hours');
}
exit;
?>
Пользователь будет перенаправлен в зависимости от серверного времени.
Пример 3: Редирект после проверки reCAPTCHA на форме
При успешной проверке – редирект, иначе – ошибка:
<?php
if ($_POST['g-recaptcha-response']) {
// проверка через API...
if ($valid) {
header('Location: /success');
exit;
}
}
header('Location: /error?reason=captcha');
exit;
?>
В случае неудачной проверки пользователь увидит /error?reason=captcha.
Пример 4: Редирект на 404 страницу, если запись не найдена
Подмена статуса 404 и перенаправление на кастомную страницу:
<?php
$id = $_GET['id'] ?? 0;
$post = get_post($id);
if (!$post) {
http_response_code(404);
header('Location: /404.html');
exit;
}
// показываем запись
?>
Статус ответа становится 404, а браузер переходит на /404.html.
Пример 5: Редирект с использованием абсолютного URL из конфигурации
Динамическая подстановка базового URL:
<?php
$base = 'https://secure.example.com/app';
$target = $base . '/dashboard';
header('Location: ' . $target);
exit;
?>
Гарантирует, что редирект ведет в правильную среду (staging/production).
Пример 6: Редирект через обертку с логированием
Логирование всех редиректов для аудита:
<?php
function redirect($url, $status = 302) {
error_log('Redirect to ' . $url . ' from ' . $_SERVER['REQUEST_URI']);
http_response_code($status);
header('Location: ' . $url);
exit;
}
// использование
redirect('https://example.com/new', 301);
?>
Лог-файл получит запись: Redirect to https://example.com/new from /old.
Пример 7: Редирект с задержкой и сообщением (мета-тег)
Показать пользователю сообщение и через несколько секунд перенаправить:
<?php
$url = 'https://example.com';
$delay = 3;
echo '<p>Перенаправление через ' . $delay . ' секунды...</p>';
echo '<meta http-equiv="refresh" content="' . $delay . '; url=' . $url . '">';
exit;
?>
На странице появится текст, затем через 3 секунды браузер перейдет по ссылке.