Как сделать редирект (перенаправление) на другую страницу в PHP?
Правильный способ сделать редирект в 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() до любого вывода", но буферизация — хороший запасной вариант для сложных случаев.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги