Header: примеры (PHP)

Отправка заголовков HTTP с помощью функции header в PHP
Раздел: HTTP
header(string $header, bool $replace = true, int $response_code = 0): void

Функция header в PHP

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

Аргументы функции
  • $header (string) - Строка заголовка. Если используется специальный код ответа, он должен быть первой частью строки, например: 'HTTP/1.1 404 Not Found'.
  • $replace (bool) - Необязательный параметр. Определяет, нужно ли заменять предыдущий аналогичный заголовок (true по умолчанию) или добавлять второй заголовок того же типа (false).
  • $response_code (int) - Необязательный параметр. Принудительно устанавливает код ответа HTTP. Это имеет эффект только если заголовок ($header) не пуст.

Функция должна быть вызвана до любого вывода на страницу. В противном случае появится предупреждение и заголовок может не отправиться.

Короткие примеры использования

Перенаправление (редирект)
<?php
header('Location: https://www.example.com/');
exit;
?>
Результат:
Браузер получает ответ с кодом 302 Found и заголовком Location, после чего автоматически переходит по указанному адресу.
Установка типа контента для JSON API
<?php
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['status' => 'success', 'data' => 'Пример']);
?>
Результат:
Клиентское приложение (например, браузер или мобильный клиент) интерпретирует ответ как JSON.
Отправка файла на скачивание
<?php
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="report.pdf"');
header('Content-Length: ' . filesize('report.pdf'));
readfile('report.pdf');
?>
Результат:
Браузер предложит сохранить файл с именем report.pdf вместо его отображения.
Установка кода ответа 404
<?php
header('HTTP/1.1 404 Not Found');
// Или, начиная с PHP 5.4:
// http_response_code(404);
?>
<?php
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
?>
Результат:
Сервер возвращает клиенту код состояния 404.

Похожие функции в PHP

  • http_response_code() - Функция устанавливает или получает код ответа HTTP. Предпочтительнее использовать для установки кода состояния, так как это более понятно и работает независимо от версии протокола.
  • headers_list() - Возвращает список всех заголовков, готовых к отправке (или уже отправленных). Полезна для отладки.
  • headers_sent() - Проверяет, были ли уже отправлены заголовки. Используется, чтобы избежать ошибки 'Cannot modify header information'.
  • setcookie() - Специализированная функция для отправки заголовка Set-Cookie. Следует использовать её вместо ручного формирования заголовка через header('Set-Cookie: ...').

Аналоги в других языках и системах

Python (Flask)
from flask import make_response, redirect

# Установка заголовка и кода
resp = make_response('Текст', 201)
resp.headers['X-Custom-Header'] = 'Значение'
return resp

# Перенаправление
return redirect('https://example.com', code=302)
JavaScript (Node.js с Express)
// Установка заголовка
res.set('Content-Type', 'text/plain');
res.set({'Header1': 'value1', 'Header2': 'value2'});

# Установка кода состояния и перенаправление
res.status(404).send('Не найдено');
res.redirect(301, 'https://example.com');
Go
http.Redirect(w, r, "https://example.com", http.StatusFound)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
Apache (в файле .htaccess)
# Установка заголовков через конфигурацию веб-сервера
Header set X-Custom-Header "Значение"
# Перенаправление
Redirect 301 /old /new

Основное отличие PHP - функция header() работает в скриптовом контексте, в то время как в других языках управление заголовками часто интегрировано в объекты ответа фреймворков. В PHP 8 нет встроенного объекта ответа по умолчанию, но многие фреймворки (Symfony, Laravel) предоставляют свои абстракции.

Типичные ошибки

Отправка заголовков после вывода
<?php
echo "Некоторый вывод";
header('Location: /newpage.php'); // Ошибка!
?>
Предупреждение: Cannot modify header information - headers already sent by...
Отсутствие exit после редиректа
<?php
header('Location: /login.php');
echo "Секретные данные"; // Этот код все равно выполнится!
?>
Браузер перейдет на новую страницу, но скрипт продолжит работу, что может привести к утечке данных или неожиданному поведению.
Некорректный формат строки заголовка
<?php
header('Location:/newpage.php'); // Отсутствует пробел после двоеточия
?>
Некоторые клиенты могут некорректно обработать такой заголовок.
Попытка установки кода состояния без заголовка (старый способ)
<?php
header('404 Not Found'); // Без указания протокола - ошибка в старых версиях PHP
?>
Заголовок может быть проигнорирован или установлен некорректно.

Изменения в последних версиях PHP

  • PHP 8.0: Строгий тип для параметра $response_code. Теперь он должен быть типа int, иначе будет выброшена ошибка TypeError.
  • PHP 5.4: Введена функция http_response_code(), которая стала предпочтительным способом установки кода состояния HTTP.
  • PHP 5.1.2: Добавлен параметр $response_code. Ранее для установки кода требовалось включать его в строку $header.

Расширенные примеры использования

Управление кэшированием страницы
Пример php
<?php
// Страница истекает через 1 час
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 3600) . ' GMT');
header('Cache-Control: max-age=3600');
?>
Отправка пользовательского заголовка безопасности
Пример php
<?php
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: DENY');
header('X-XSS-Protection: 1; mode=block');
?>
Принудительное обновление страницы каждые 30 секунд
Пример php
<?php
header('Refresh: 30; url=/samepage.php');
?>
Отправка данных в формате CSV
Пример php
<?php
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="data.csv"');
$output = fopen('php://output', 'w');
fputcsv($output, ['Имя', 'Возраст', 'Город']);
fputcsv($output, ['Анна', 25, 'Москва']);
fclose($output);
?>
Использование параметра replace
Пример php
<?php
// Добавление нескольких заголовков Set-Cookie
header('Set-Cookie: cookie1=value1', false); // false - НЕ заменять предыдущие заголовки этого типа
header('Set-Cookie: cookie2=value2', false);
?>
Обработка CORS (Cross-Origin Resource Sharing)
Пример php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    header('Access-Control-Allow-Origin: https://client-domain.com');
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
    header('Access-Control-Allow-Headers: Content-Type');
    header('Access-Control-Max-Age: 86400'); // Кэшировать на 24 часа
    exit(0);
}
header('Access-Control-Allow-Origin: https://client-domain.com');
?>
Отправка частичного контента (HTTP 206) для потокового видео
Пример php
<?php
$file = 'video.mp4';
$size = filesize($file);
$start = 0;
$end = $size - 1;

if (isset($_SERVER['HTTP_RANGE'])) {
    preg_match('/bytes=(\d+)-(\d*)/', $_SERVER['HTTP_RANGE'], $matches);
    $start = intval($matches[1]);
    if (!empty($matches[2])) {
        $end = intval($matches[2]);
    }
    header('HTTP/1.1 206 Partial Content');
    header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size);
} else {
    header('Accept-Ranges: bytes');
}
header('Content-Length: ' . ($end - $start + 1));
header('Content-Type: video/mp4');
// ... далее чтение и вывод части файла
?>

PHP header function comments

En
Header Send a raw HTTP header