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. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x