header

(PHP 4, PHP 5, PHP 7, PHP 8)

header Отправляет необработанный (сырой) HTTP-заголовок

Описание

header(string$header, bool$replace = true, int$response_code = 0): void

Функцию header() вызывают для отправки HTTP-заголовка. В » спецификации HTTP/1.1 подробно описаны HTTP-заголовки.

Помните, функцию header() разрешено вызывать, только если клиенту ещё не были переданы данные. То есть она должна идти первой в выводе, перед её вызовом не должно быть HTML-тегов, пустых строк и т. п. Иногда возникает ошибка, когда при чтении кода файловыми функциями наподобие include или require в коде попадаются пробелы или пустые строки, которые выводятся до вызова функции header(). Те же проблемы могут возникать, когда в одном файле записаны PHP-код и HTML-разметка.

<html>
<?php


header('Location: http://www.example.com/');
exit;

?>

Список параметров

header

Строка заголовка.

Существует два вызова заголовка, которые отличаются от других. Первый — заголовок, который начинается со строки «HTTP/» (регистр не важен). Этот заголовок определит код состояния HTTP для ответа. Например, если веб-сервер Apache через директиву ErrorDocument сконфигурирован на обработку запросов к несуществующим файлам PHP-скриптом, то разработчик, вероятно, захочет убедиться, что скрипт генерирует правильный код состояния.

<?php

// Пример иллюстрирует передачу заголовка "HTTP/".
// Из альтернативных способов в типичных случаях выбирают этот:
// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
// (чтобы переопределить сообщения о состоянии HTTP для клиентов, которые все еще работают по протоколу HTTP/1.0)
// 2. http_response_code(404); (для определить сообщение по умолчанию)
header("HTTP/1.1 404 Not Found");

?>

Другой отличающийся вид заголовка — «Location:». Он отправляет заголовок обратно в браузер, а также возвращает браузеру код состояния REDIRECT (302), если только код состояния 201 или 3xx не был установлен.

<?php

header
("Location: http://www.example.com/");


exit;

?>
replace

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

<?php

header
('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);

?>
response_code

Принудительно задаёт код ответа HTTP. Обратите внимание, что этот параметр работает только тогда, когда строка header не пуста.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Если не получилось запланировать отправку заголовка, функция header() выдаёт ошибку уровня E_WARNING.

Примеры

Пример #1 Диалог загрузки

Если нужно предложить пользователю сохранить пересылаемые данные, например сгенерированный PDF-файл, указывают заголовок » Content-Disposition, который подставляет рекомендуемое имя файла и заставляет браузер показать диалог сохранения.

<?php

// Будем передавать PDF
header('Content-Type: application/pdf');

// Он будет называться downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// Исходный PDF-файл original.pdf
readfile('original.pdf');

?>

Пример #2 Директивы для работы с кешем

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

<?php

header
("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Дата в прошлом

?>

Замечание:

Бывают ситуации, в которых браузер не будет кешировать страницы, даже если приведённые заголовки не были переданы. Пользователям доступны настройки браузера, которые изменяют поведение кеширования по умолчанию. Отправляя приведённые заголовки, разработчик должен переопределить любые настройки, которые в других случаях приводят к кэшированию вывода скрипта.

Кроме того, через функцию session_cache_limiter() и директиву session.cache_limiter можно автоматически создавать правильные заголовки, которые связаны с кешированием при работе с сессиями.

Пример #3 Настройка cookie

Функцией setcookie() удобно устанавливать cookies. Чтобы установить cookie с атрибутами, которые не поддерживает функция setcookie(), вызывают функцию header().

Например, следующий код устанавливает cookie с атрибутом Partitioned.

<?php

header
('Set-Cookie: name=value; Secure; Path=/; SameSite=None; Partitioned;');

?>

Примечания

Замечание:

Доступ к заголовкам и их вывод будет осуществляться только в случае, если в используемом вами SAPI есть их поддержка.

Замечание:

Чтобы обойти эту проблему, можно буферизовать вывод скрипта. Тогда все выводимые данные будут буферизоваться на сервере, пока не будет дана явная команда на пересылку данных. Управлять буферизацией можно вручную — функциями ob_start() и ob_end_flush(), либо задав директиву output_buffering в конфигурационном файле php.ini, или настроив конфигурацию сервера нужным образом.

Замечание:

Строка заголовка HTTP-состояния будет отправлена клиенту первой, независимо от того, вызвана ли функция header() первой или нет. Статус можно переопределить в любое время вызовом функции header() с новой строкой состояния, если HTTP-заголовки ещё не были отправлены.

Замечание:

Спецификация HTTP/1.1 требует, чтобы в качестве аргумента заголовка » Location: был указан абсолютный URI, который бы включал схему, имя хоста и абсолютный путь, хотя иногда клиенты в состоянии принимать и относительные URI. Абсолютный URI можно построить самому через элементы $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] или функцией dirname():

<?php


$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;

?>

Замечание:

Идентификатор сессии не будет передаваться вместе с заголовком Location, даже если включена настройка session.use_trans_sid. Его нужно передавать вручную, используя константу SID.

Смотрите также

To Top