Редиректы с id параметром: способы и примеры в PHP

Раздел: PHP -> HTTP-редиректы в PHP

Редирект с параметром id в PHP

Как выполнить перенаправление на страницу, передав в URL идентификатор id?

Наиболее эффективный способ - использование функции header() с обязательным вызовом exit() после отправки заголовка. Это гарантирует, что скрипт завершится и не будет продолжать выполнение.


$id = $_GET['id'] ?? null;
if ($id) {
    $url = 'target.php?id=' . urlencode($id);
    header('Location: ' . $url);
    exit;
}

Location php id (редирект с параметром id)

Функция urlencode() защищает URL от некорректных символов. Если id содержит пробелы или спецсимволы, они будут корректно закодированы.

Ошибка: заголовки уже отправлены (headers already sent). Это происходит, если перед header() был выведен любой текст (echo, HTML, пробелы). Решение: проверять, что перед header() нет вывода, или использовать буферизацию (ob_start()).

Типичная проблема: забытый exit() после header(). Без него скрипт может продолжить выполнение и вывести контент, который не будет показан после редиректа, но может вызвать логические ошибки.

Цель использования: простой редирект при любом значении id (строка, число). Применяется, когда требуется передать идентификатор на другую страницу без дополнительной обработки.

Как перенаправить только если id является числом?

Если id должен быть строго числом (например, идентификатор записи в базе данных), перед редиректом стоит проверить тип.


$id = $_GET['id'];
if (is_numeric($id)) {
    header('Location: page.php?id=' . intval($id));
    exit;
} else {
    // обработка ошибки: показать 404 или редирект на главную
}

Использование intval() дополнительно приводит к целому числу, предотвращая возможные инъекции.

Ошибка: is_numeric() пропускает числа с плавающей точкой и hex-строки. Если требуется только целые числа, используйте ctype_digit() или фильтр FILTER_VALIDATE_INT.

Как сделать постоянный (301) или временный (302) редирект с id?

По умолчанию header('Location: ...') отправляет код 302 (временное перенаправление). Для постоянного редиректа (301) нужно указать код явно.


$id = $_GET['id'];
if ($id) {
    header('Location: new-location.php?id=' . urlencode($id), true, 301);
    exit;
}

Третий параметр функции header() задаёт HTTP-код. 301 подходит, если страница окончательно перемещена, 302 - для временных перенаправлений.

Ошибка: неверный код может сбить с толку поисковые системы. При 301 они обновляют индекс, при 302 - нет. Выбор кода должен соответствовать реальному назначению редиректа.

Как при редиректе сохранить все текущие GET-параметры вместе с id?

Иногда требуется перенаправить на другой адрес, не потеряв все параметры запроса.


$params = $_GET; // все параметры
$params['id'] = $newId; // или оставить оригинальный id
$query = http_build_query($params);
header('Location: new-page.php?' . $query);
exit;

Функция http_build_query() собирает массив параметров в строку запроса, автоматически кодируя значения. Это удобно, когда нужно модифицировать один параметр, сохранив остальные.

Ошибка: не стоит полагаться на $_GET без фильтрации. Перед сборкой необходимо очистить параметры от нежелательных данных (например, удалить служебные).

Как выполнить редирект с id через относительный или абсолютный URL?

header() принимает как относительный путь (page.php?id=1), так и абсолютный (http://example.com/page.php?id=1). Выбор зависит от структуры сайта.


// Относительный (на том же хосте)
header('Location: /section/page.php?id=' . $id);

// Абсолютный (на внешний ресурс)
header('Location: https://other-site.com/page.php?id=' . $id);
exit;

При использовании относительного пути браузер добавляет текущий протокол и домен. Абсолютный URL применяется для редиректов на другие сайты или поддомены.

Ошибка: редирект на относительный путь без ведущего слеша может работать некорректно, если текущая страница находится в поддиректории. Всегда указывайте путь от корня (/page.php) или полный URL.

Расширенные примеры редиректов с id

Пример 1. Обработка id с валидацией через фильтры

Пример

$rawId = $_GET['id'] ?? '';
$id = filter_var($rawId, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
if ($id !== false) {
    header('Location: show.php?id=' . $id);
    exit;
} else {
    header('Location: error.php?code=invalid_id');
    exit;
}

Результат: Если id равен 42, браузер перейдет на show.php?id=42. Если id отсутствует или не является целым положительным числом, произойдет редирект на error.php.

Пример 2. Редирект с id и дополнительным параметром через http_build_query

Пример

$base = 'https://api.example.com/resource';
$params = [
    'id' => $_GET['id'],
    'token' => 'abc123',
    'format' => 'json'
];
$url = $base . '?' . http_build_query($params);
header('Location: ' . $url, true, 302);
exit;

Результат: формируется URL вида https://api.example.com/resource?id=5&token=abc123&format=json. Гарантируется корректное кодирование всех значений.

Пример 3. Бесконечный редирект при отсутствии exit()

Пример

$id = 1;
header('Location: test.php?id=' . $id);
// Не вызван exit()
// Дальнейший код выполняется
sleep(5);
echo 'Этот текст не должен отображаться';

Результат: браузер получит заголовок редиректа, но PHP продолжит выполнение. После паузы скрипт выведет текст, который может быть проигнорирован, но в логах появятся ошибки «Cannot modify header information» (если был вывод). Это демонстрирует важность вызова exit() сразу после header().

Пример 4. Редирект с проверкой существования id в базе данных

Пример

$id = (int)$_GET['id'];
// Подключение к БД
$stmt = $pdo->prepare('SELECT 1 FROM pages WHERE id = ?');
$stmt->execute([$id]);
if ($stmt->fetchColumn()) {
    header('Location: detail.php?id=' . $id);
    exit;
} else {
    header('Location: 404.php');
    exit;
}

Результаты: если id найден в таблице pages, пользователь перенаправляется на detail.php с этим id. Иначе – на страницу 404. Это предотвращает редирект на несуществующие записи.

Пример 5. Редирект с id и сохранением фрагмента (#)

Пример

$id = $_GET['id'];
$fragment = '#section2';
$url = 'page.php?id=' . urlencode($id) . $fragment;
header('Location: ' . $url);
exit;

Результат: строка запроса и якорь корректно склеиваются. Браузер перейдет на page.php?id=значение#section2. Обратите внимание, что якорь (фрагмент) не кодируется, так как обрабатывается браузером.

Редирект с параметром id - comments

En
Location php id (php)