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