(PHP 4, PHP 5, PHP 7, PHP 8)
header — Отправляет необработанный HTTP-заголовок
Функцию header() вызывают для отправки HTTP-заголовка. » Спецификация HTTP/1.1 подробно описывает HTTP-заголовки.
Помните, функцию header() разрешено вызывать, только если клиенту ещё не передали данные. То есть функция должна идти первой в выводе, перед её вызовом не должно быть HTML-тегов, пустых строк и т. п. Иногда возникает ошибка, когда при чтении кода файловыми функциями наподобие include или require в коде попадаются пробелы или пустые строки, которые выводятся до вызова функции header(). Те же проблемы могут возникать, когда в одном файле записали PHP-код и HTML-разметку.
<html>
<?php
/* Этот пример приведёт к ошибке. Обратите внимание
* на тег вверху, который будет выведен до вызова функции header() */
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
.