Как сделать редирект на PHP

Чтобы сделать редирект на PHP, передайте адрес в заголовке Location через header(). Вызов разместите до вывода страницы, а после него добавьте exit(). Для временного перехода используйте код 302, для постоянного переноса – 301. Адрес назначения и код ответа задавайте явно.

Что за редирект?

Редирект – это перенаправление браузера с одного адреса на другой. Сервер возвращает код ответа и заголовок Location с адресом назначения. Браузер запрашивает этот адрес, после чего показывает целевую страницу.

Схема перенаправления пользователя на другой адрес

Перенаправление помогает в нескольких ситуациях:

  • После замены движка сайт получает другую структуру адресов.
  • Владелец переносит материал в другой раздел или меняет его URL.
  • Сайт переезжает на новый домен, но посетители открывают старые ссылки.
  • После авторизации приложение отправляет пользователей на страницы согласно их ролям.

Редирект со старого домена настраивает владелец сайта. Старый домен должен принимать запросы и возвращать перенаправление на новый. Поисковая система сама такую настройку не создает.

Если вы планируете переезд при создании нового сайта, заранее составьте соответствие старых и новых страниц. Посетитель должен попадать на подходящий материал.

Особенности редиректа на PHP

PHP формирует перенаправление на сервере, до отправки содержимого страницы. Для этого скрипт использует функцию header(). Функция отправляет HTTP-заголовки, но сама не завершает выполнение программы.

Особенности функции header() для перенаправления в PHP

После Location вызывайте exit(), чтобы остановить оставшийся код. Иначе скрипт может продолжить запись данных или выполнение других действий.

Как выполнить перенаправление через header()

Передайте функции header() заголовок Location, адрес назначения и код ответа. Локальный пример поможет проверить переход, а формат адреса определит его направление.

Применение редиректа header()

Создайте файлы redirect.php и redirect2.php в одной папке. Первый файл вернет перенаправление, второй покажет сообщение.

В файл redirect.php поместите код:

<?php
header('Location: /redirect2.php', true, 302);
exit();

В файл redirect2.php добавьте сообщение:

<?php
echo 'Привет! Вы находитесь в файле redirect2.php';

У функции header() в этом примере три аргумента:

  • 'Location: /redirect2.php' задает заголовок и адрес назначения.
  • true заменяет ранее заданный заголовок Location.
  • 302 устанавливает код временного перенаправления.

Если PHP установлен и доступен из командной строки, запустите пример:

  1. Откройте терминал и перейдите в папку с файлами командой cd "/путь/к/папке". Вместо текста в кавычках подставьте полный путь к вашей папке.
  2. Выполните php -S localhost:8000. Терминал сообщит о запуске встроенного сервера.
  3. Откройте в браузере http://localhost:8000/redirect.php. Адрес сменится на http://localhost:8000/redirect2.php, а страница покажет приветствие.
Сообщение на странице redirect2.php после перенаправления
Код PHP-файла с перенаправлением

Чтобы остановить локальный сервер, нажмите Ctrl+C в его терминале. Для отмены перенаправления удалите вызов header() и следующий exit().

Как задать адрес назначения

Путь /redirect2.php начинается от корня текущего сайта. Путь redirect2.php браузер разрешает относительно адреса запрошенной страницы. Например, запрос к /test/redirect.php приведет на /test/redirect2.php.

Для перехода на другой домен укажите полный URL с протоколом. Не добавляйте пробелы внутрь адреса. В URL http://redirect2.php браузер воспринимает redirect2.php как имя хоста.

Как выбрать код 301, 302, 307 или 308

Код ответа сообщает клиенту, как трактовать перенос ресурса. Не все ответы класса 3xx означают переход на другую страницу. Например, 304 относится к проверке кеша.

Коды состояния HTTP для перенаправления
КодНазначениеПоведение метода запроса
301Постоянный перенос страницыКлиент может заменить POST на GET
302Временное перенаправлениеКлиент может заменить POST на GET
307Временный перенос с сохранением запросаКлиент сохраняет метод и тело запроса
308Постоянный перенос с сохранением запросаКлиент сохраняет метод и тело запроса

Для постоянного переноса страницы замените 302 на 301:

<?php
header('Location: /redirect2.php', true, 301);
exit();

Код ответа можно установить отдельно через http_response_code():

<?php
http_response_code(301);
header('Location: /redirect2.php');
exit();

Редирект 301 сообщает поисковику о постоянном переносе страницы. Такой ответ служит сигналом выбрать целевой URL основным для индексации. Код 302 сообщает о временном переходе, поэтому исходный адрес может оставаться в результатах поиска, а целевой URL тоже может попасть в индекс при других сигналах выбора основного адреса.

Смена URL в поисковой выдаче занимает время. При переезде поисковик заново обходит страницы и может менять позиции. Выбирайте код по характеру переноса и направляйте каждый старый URL на соответствующую новую страницу.

Массовый редирект всех материалов на главную не заменяет соответствие старых и новых страниц. PHP-редирект не получает особых преимуществ перед серверным правилом с тем же HTTP-ответом.

После успешной обработки формы обычно подходит код 303. Он направляет браузер на страницу результата с запросом GET. Если принимающий обработчик должен получить исходный POST с телом, выбирайте 307 или 308.

Семантику ответов описывает справочник HTTP-статусов MDN.

Как перенаправить пользователя по его роли

Приложение получает роль после проверки учетных данных на сервере. Не берите роль напрямую из параметров ссылки или формы. В примере роль хранится в серверной сессии:

<?php
session_start();
$who = $_SESSION['role'] ?? '';

switch ($who) {
    case 'user':
        $redirect_url = '/blog.html';
        break;
    case 'author':
        $redirect_url = '/author.html';
        break;
    case 'admin':
        $redirect_url = '/admin.html';
        break;
    default:
        $redirect_url = '/registration.html';
}

header('Location: ' . $redirect_url, true, 302);
exit();

Замените пути на существующие страницы вашего приложения. Запускайте этот код до вывода HTML. Если обработчик завершает вход через POST, используйте 303 вместо 302.

Перенаправление по роли не защищает административную страницу от прямого открытия. Сама страница должна проверять сессию и права пользователя. Код 200 для ответа с перенаправлением не используйте.

Как проверить редирект и избежать ошибок

Перед публикацией проверьте маршрут от исходного URL до конечной страницы:

  1. В файле, который принимает исходный запрос, задайте разрешенный адрес назначения в строке header('Location: ...'). Для локального примера это файл redirect.php, а значение – /redirect2.php. Не передавайте содержимое $_GET['next'] напрямую в Location: злоумышленник сможет отправить посетителя на чужой сайт.
  2. Откройте файл назначения, например redirect2.php, и убедитесь, что в нем нет вызова header('Location: /redirect.php') или другого перенаправления на исходный URL. Если такой вызов есть, удалите его или замените код файла сообщением из примера. При открытии redirect.php адрес должен один раз смениться на redirect2.php, после чего появится приветствие.
  3. Откройте исходный URL в браузере. Для локального примера введите http://localhost:8000/redirect.php. Браузер должен показать приветствие по адресу http://localhost:8000/redirect2.php.
  4. Вернитесь в терминал, где работает сервер php -S localhost:8000. В журнале запросов найдите строки с /redirect.php и /redirect2.php. Первая должна содержать код [302], вторая – [200]. Повторяющаяся последовательность этих запросов указывает на цикл.

Ошибка «headers already sent» означает, что вывод начался раньше отправки заголовков. Проверьте echo, HTML, пробелы перед открывающим тегом PHP и подключаемые файлы. Сохраните PHP-файлы без BOM – невидимой метки в начале файла.

Постоянные перенаправления 301 и 308 могут сохраняться в кеше клиента. Во время настройки используйте временный код 302. Если браузер воспроизводит старый маршрут, очистите его кеш перед повторной проверкой.

Какой редирект использовать в вашем случае

Для обычного временного перехода выбирайте 302, для постоянного переноса – 301. Если запрос должен сохранить метод и тело, используйте 307 или 308. После обработки формы выбирайте 303 и отдельную страницу результата.

Переключайте перенос на постоянный код после проверки всей цепочки. Так ошибочный адрес не останется у посетителей в кеше во время настройки.

Комментарии

Оставьте свой комментарий
ЛШ
Леонид Ш.

Приветствую!
Подскажите, как как в файл redirect2.php добавить другое сообщение,при входе напрямую.
Пытаюсь реализовать send.php+success.php