header
(PHP 4, PHP 5, PHP 7)
header — Отправка HTTP-заголовка
Описание
$header
, bool $replace
= true
, int $response_code
= 0
) : voidheader() используется для отправки 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 сконфигурирован таким образом, чтобы запросы к несуществующим файлам обрабатывались средствами PHP-скрипта (используя директивуErrorDocument
), вы наверняка захотите убедиться, что скрипт генерирует правильный код состояния.<?php
header("HTTP/1.0 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
не является пустой.
Возвращаемые значения
Эта функция не возвращает значения после выполнения.
Примеры
Пример #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
. Эти настройки можно использовать для автоматической генерации заголовков управляющих кешированием.
Примечания
Замечание:
Доступ к заголовкам и их вывод будет осуществляться только в случае, если в используемом вами SAPI есть их поддержка.
Замечание:
Чтобы обойти эту проблему, можно буферизовать вывод скрипта. В этом случае все выводимые данные будут буферизоваться на сервере, пока не будет дана явная команда на пересылку данных. Управлять буферизацией можно вручную функциями ob_start() и ob_end_flush(), либо задав директиву
output_buffering
в конфигурационном файле php.ini, или же настроив соответствующим образом конфигурацию сервера.
Замечание:
Строка заголовка состояния HTTP всегда будет отсылаться клиенту первой, вне зависимости от того был соответствующий вызов функции header() первым или нет. Это состояние можно перезаписать, вызывая header() с новой строкой состояния в любое время, когда можно отправлять HTTP-заголовки.
Замечание:
В Microsoft Internet Explorer 4.01 есть баг, из-за которого это не работает. Обойти его никак нельзя. В Microsoft Internet Explorer 5.5 также есть этот баг, но его уже можно устранить установкой Service Pack 2 или выше.
Замечание:
Спецификация HTTP/1.1 требует указывать абсолютный URI в качестве аргумента » Location:, включающий схему, имя хоста и абсолютный путь, хотя некоторые клиенты способны принимать и относительные 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
.
Смотрите также
- headers_sent() - Проверяет, были ли отправлены заголовки
- setcookie() - Отправляет cookie
- http_response_code() - Получает или устанавливает код ответа HTTP
- header_remove() - Удаляет ранее установленные заголовки
- Раздел документации HTTP-аутентификации