Avatar ·

Как сделать редирект (перенаправление) на другую страницу в PHP?

Всем привет! Я только начал изучать PHP и пишу свой первый сайт — простую форму регистрации. После того как пользователь отправляет данные через форму, я хочу перенаправить его на страницу приветствия (например, welcome.php). Но у меня ничего не получается. Вот мой код: ```php ``` Но после отправки формы я просто вижу сообщение "Вы успешно зарегистрированы!" и остаюсь на той же странице. Редирект не срабатывает. Я читал, что можно использовать `header()`, но у меня почему-то ничего не работает. В чём может быть проблема? Может быть, я неправильно пишу URL? Нужно ли указывать полный адрес типа `http://mysite.com/welcome.php` или можно просто имя файла? И ещё вопрос: как сделать редирект с задержкой, чтобы сначала показать сообщение "Спасибо за регистрацию, через 3 секунды вы будете перенаправлены", а потом уже перебросить пользователя? И можно ли сделать редирект на внешний сайт, например, на Google? Буду благодарен за подробное объяснение с примерами. Заранее спасибо! <<>>

Правильный способ сделать редирект в PHP

Ваша основная ошибка — вывод текста echo перед вызовом header(). Функция header() должна вызываться до любого вывода в браузер — будь то echo, print, HTML-код или даже пробелы перед <?php. Если вы что-то вывели, заголовки уже отправлены, и header() работать не будет.

Вот исправленный код:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Обработка формы...
    
    // Редирект — ДО любого вывода!
    header("Location: welcome.php");
    exit; // Важно: прекращаем выполнение скрипта
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>Форма регистрации</title>
</head>
<body>
    <!-- HTML форма -->
</body>
</html>

Почему нужно использовать exit?

После вызова header("Location: ...") PHP продолжает выполнять скрипт. Без exit (или die) может выполниться остальной код, что приведёт к неожиданному поведению. Всегда завершайте редирект командой exit.

Как указать URL?

Можно использовать:

  • Относительный путь — header("Location: welcome.php"); (работает, если файл в той же директории)
  • Абсолютный путь от корня сайта — header("Location: /welcome.php");
  • Полный URL — header("Location: https://mysite.com/welcome.php"); (обязательно для внешних сайтов)

Коды состояния HTTP для редиректа

По умолчанию header("Location: ...") отправляет код 302 (временный редирект). Чтобы указать другой код, используйте:

// 301 — постоянный редирект (для SEO, когда страница навсегда переехала)
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://new-site.com/page");

// 303 — смотри другое (после POST-запроса, чтобы избежать повторной отправки формы)
header("HTTP/1.1 303 See Other");
header("Location: success.php");

// 307 — временный редирект с сохранением метода запроса
header("HTTP/1.1 307 Temporary Redirect");
header("Location: /maintenance.php");

Редирект с задержкой и сообщением

Для этого используйте HTML-мета-тег Refresh или JavaScript:

<?php
// Вариант 1: HTML meta refresh (простой)
echo '<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="refresh" content="3;url=welcome.php">
</head>
<body>
    <p>Спасибо за регистрацию! Через 3 секунды вы будете перенаправлены.</p>
    <p><a href="welcome.php">Нажмите здесь</a>, если не хотите ждать.</p>
</body>
</html>';
exit;

// Вариант 2: JavaScript (более гибкий)
echo '<!DOCTYPE html>
<html>
<head>
    <script>
        setTimeout(function() {
            window.location.href = "welcome.php";
        }, 3000);
    </script>
</head>
<body>
    <p>Спасибо за регистрацию! Перенаправление через 3 секунды...</p>
</body>
</html>';
exit;

Редирект на внешний сайт

Просто укажите полный URL:

header("Location: https://google.com");
exit;

Важные советы

  • Всегда проверяйте, нет ли вывода перед header() — даже пустая строка или пробел до <?php сломают редирект.
  • Используйте ob_start() в начале скрипта, если не можете контролировать вывод (буферизация вывода).
  • Для редиректа после POST-запроса используйте паттерн POST/Redirect/GET — это предотвратит повторную отправку формы при обновлении страницы.
<<>>

Альтернативный подход: буферизация вывода

Если у вас сложный проект, где трудно гарантировать отсутствие вывода перед header(), используйте буферизацию вывода. Это позволяет накапливать весь вывод в буфере и отправлять его только когда вы готовы.

<?php
// Включаем буферизацию в самом начале файла
ob_start();

// Теперь можно выводить что угодно — это не помешает header()
echo "Какой-то текст...";
?>
<html>
<body>
    <p>Ещё HTML-код</p>
</body>
</html>
<?php
// В нужный момент делаем редирект
header("Location: /new-page.php");
ob_end_flush(); // Отправляем буфер и заголовки
exit;
?>

Когда это полезно?

  • В устаревших проектах, где много echo до логики редиректа.
  • При интеграции с шаблонизаторами, которые могут выводить контент до вызова header().
  • Для отладки — можно вывести сообщение об ошибке и всё равно сделать редирект.

Недостатки

  • Потребляет больше памяти (весь вывод хранится в буфере).
  • Может маскировать проблемы с архитектурой кода.
  • Не работает, если буферизация уже отключена на сервере.

Лучше всё же соблюдать правило "header() до любого вывода", но буферизация — хороший запасной вариант для сложных случаев.