(PHP 3, PHP 4)
header - отправляет "сырую" HTTP-шапку/header. Описание
int header (string string [, bool replace])
header() используется для отправки необработанных HTTP-шапок. См. в спецификации
HTTP/1.1 информацию о
HTTP headers. Необязательный параметр replace указывает, должна ли шапка замещать предыдущую аналогичную шапку, или нужно
добавить вторую header того же самого типа. По умолчанию выполняется замещение, но, если вы передаёте
FALSE в качестве второго аргумента, вы можете форсировать создание нескольких headers
одного типа. Например:
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM',false); |
Здесь два особых вызова шапок. В первом это header, начинающийся строкой "HTTP/" (регистр не имеет значения), используемый для создания HTTP статус-кода для
отправки. Например, если вы сконфигурировали Apache для использования PHP-скрипта
для обработки запросов отсутствующих файлов (используя директиву ErrorDocument), вам потребуется удостовериться, что ваш скрипт генерирует соответствующий
статус-код. <?php
header("HTTP/1.0 404 Not Found");
?> |
Примечание:
строка шапки HTTP-статуса всегда будет отправляться первой клиенту, независимо от того, идёт вызов
header() первым или нет. Этот статус может быть переопределён вызовом header() с новой строкой статуса в любое время, если только HTTP headers уже не
отправлены.
Примечание:
в PHP 3 это работает только в том случае, если PHP скомпилирован как Apache-модуль. Вы может добиться того же эффекта, используя шапку
Status.
header("Status: 404 Not Found"); |
Второй особый случай это "Location:" header. Здесь header не только отсылается обратно браузеру, но также возвращается статус-код
REDIRECT (302), если только какой-нибудь 3xx статус-код не был уже установлен.
header("Location: http://www.example.com/"); /* Redirect browser */
exit; /* Убедитесь, что последующий код не
выполняется, когда мы перенаправляем. */ |
Примечание: HTTP/1.1 требует абсолютного URI в качестве аргумента для
Location: включая схему, имя хоста и абсолютный путь, но некоторые клиенты принимают
относительные URI. Как правило вы можете сами использовать $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF']
и dirname() для создания абсолютного URI из относительного:
header("Location: http://".$_SERVER['HTTP_HOST']
.dirname($_SERVER['PHP_SELF'])
."/".$relative_url); |
PHP-скрипты часто генерируют динамическое содержимое, которое обязано не кэшироваться клиентским браузером или proxy-кэшами между клиентским
браузером и сервером. Во многих прокси и клиентах можно отключать кэширование.
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // дата в прошлом
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// всегда модифицируется
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0 |
Примечание: вы можете обнаружить, что ваши страницы не кэшируются, даже если вы не
выводите все выше указанные шапки. Есть опции, которые могут быть установлены пользователями в своих браузерах, изменяющие поведение по
умолчанию кэширования. Отправляя вышеуказанные шапки, вы должны
переопределить любые установки, которые иначе могут кэшировать ваши скрипты.
Кроме того, session_cache_limiter() и установка конфигурации
session.cache_limiter могут использоваться для автоматической генерации корректны шапок кэширования,
когда используются сессии. Помните, что header() обязана вызываться до отправки любого вывода: нормальными ли тэгами HTML,
пустыми строками в файле, или из PHP. Очень частой ошибкой является чтение кода функциями
include() или require(), или другой функцией доступа к файлу, и наличие пробелов или пустых строк,
которые выводятся до вызова header(). Та же проблема возникает при использовании единого PHP/HTML-файла.
<?php header ("Content-type: audio/x-pn-realaudio"); ?>
// нарушение: обратите внимание на пустую строчку вверху |
Примечание:
в PHP 4 вы можете использовать буферизацию вывода для решения этой проблемы,
передавая браузеру весь ваш вывод, буферизуемый на сервере до отправки. Вы можете сделать это вызовом
ob_start() и ob_end_flush() в вашем скрипте, или установив директиву конфигурации
output_buffering в файле php.ini или файлах конфигурации сервера.
Если вы хотите, чтобы пользователю задавался вопрос о сохранении данных,
высылаемых вами, таких как сгенерированный PDF-файл, вы можете использовать шапку
Content-Disposition для предоставления рекомендуемого файла и форсировать отображение браузером
диалога save. <?php
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=downloaded.pdf");
/* ... вывод pdf-файла ... */ |
Примечание:
в Microsoft Internet Explorer 4.01 имеется баг, не дающий реализовать
это. Средства от этого нет. Также имеется баг в Microsoft Internet Explorer 5.5,
но его можно исправить, обновив до Service Pack 2 или новее.
Примечание: если safe mode включён,
uid скрипта добавляется к части realm шапки WWW-Authenticate, если вы устанавливаете эту шапку (используется для HTTP Authentication).
См. также headers_sent(),
setcookie() и раздел HTTP-аутентификация. |