PHP
Редирект в PHP: header Location, 301, 302 и переход на другую страницу
Короткий ответ: редирект в PHP делают функцией header() до любого вывода на страницу. Самый простой вариант выглядит так: header('Location: /new-page.php'); exit;
Редирект — это не “открыть страницу внутри PHP”, а отправить браузеру HTTP-заголовок с указанием нового адреса. Браузер получает этот заголовок и сам переходит по новому адрес
Простой редирект на другую страницу
Создайте файл old.php
<?php
header('Location: /new.php');
exit;
Создайте файл new.php
<?php
echo 'Вы перешли на новую страницу';
Запустите локальный сервер и откройте old.php. Браузер должен автоматически перейти на new.php
Почему нужен exit
После header('Location: ...') PHP-код технически может продолжить выполняться. Поэтому сразу после редиректа ставят exit
<?php
if (!isset($_SESSION['user_id'])) {
header('Location: /login.php');
exit;
}
echo 'Закрытая страница';
Так вы не рискуете выполнить код, который должен работать только после авторизации
и 301 редирект
По умолчанию Location обычно воспринимается как временный редирект. Для постоянного переезда страницы используйте код 301
<?php
header('Location: /new-address.php', true, 301);
exit;
Временный редирект подходит для авторизации, формы, выбора языка или временной логики. Постоянный редирект нужен, если адрес окончательно изменился и старый адрес больше не должен использоваться
Редирект после отправки формы
Частый сценарий: пользователь отправил форму, данные обработались, и его нужно отправить на страницу “спасибо”
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
if ($name !== '') {
// Здесь могла бы быть запись в базу или отправка письма
header('Location: /thanks.php');
exit;
}
}
Такой подход защищает от повторной отправки формы при обновлении страницы. Пользователь уже находится не на странице обработки, а на отдельной странице результата
Ошибка headers already sent
Редирект не сработает, если до header() уже был вывод в браузер
<?php
echo 'Текст уже отправлен';
header('Location: /new.php');
exit;
PHP не может отправить заголовки после того, как начал отдавать тело ответа. Поэтому header() должен быть выше HTML, echo, пробелов перед <?php и случайного вывода
Редирект по условию
Пример для простой проверки роли пользователя
<?php
$role = $_GET['role'] ?? 'guest';
if ($role !== 'admin') {
header('Location: /login.php');
exit;
}
echo 'Панель администратора';
Откройте страницу без параметра — будет переход на /login.php. Откройте с ?role=admin — появится текст панели
Редирект на внешний сайт
Можно указать полный адрес
<?php
header('Location: https://example.com');
exit;
Если адрес приходит от пользователя, не подставляйте его вслепую. Иначе можно получить open redirect: злоумышленник сформирует ссылку на ваш сайт, которая перекинет пользователя на чужой адрес
Мини-практика
Сделайте три файла: form.php, thanks.php и login.php. В form.php обработайте POST-запрос и после успешного ввода имени отправьте пользователя на thanks.php. Если имя пустое, оставьте его на форме и покажите сообщение об ошибке
Так вы закрепите главный сценарий редиректа: сначала обработка, потом переход, потом exit
Частые ошибки
Пишут HTML до header Редирект должен быть до вывода страницы
Забывают exit После редиректа код может продолжить выполняться
Ставят 301 для временной логики Для входа, формы или проверки доступа используйте временный переход, а не постоянный
Подставляют внешний адрес из GET без проверки Так можно случайно создать опасный открытый редирект
Что почитать дальше по PHP
Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:
- Переход на другую страницу при нажатии кнопки в PHP
- PHP с нуля: первый файл и вывод на страницу
- Как изменить адресную строку в PHP: редирект, красивые адрес и History API
- Как прикрутить меню на PHP и не копировать его в каждую страницу