Заголовки

Сервер, отвечая на запрос, сначала отправляет набор заголовков. Они представляют собой простые строки формата key: value, которые заканчиваются символом новой строки. Заголовки отделяются от тела запроса дополнительной новой строкой.

void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

  • Используется для отправки HTTP заголовка.
  • Помните, что функцию header() можно вызывать только если клиенту еще не передавались данные. То есть она должна идти первой в выводе, перед ее вызовом не должно быть никаких HTML тэгов, пустых строк и т.п. Довольно часто возникает ошибка, когда при чтении кода файловыми функциями, вроде include или require, в этом коде попадаются пробелы или пустые строки, которые выводятся до вызова header(). Те же проблемы могут возникать и при использовании одиночного PHP/HTML файла.
  • Необязательный параметр replace определяет, надо ли заменять предыдущий аналогичный заголовок или заголовок того же типа. По умолчанию заголовок будет заменен, но если передать FALSE, можно задать несколько однотипных заголовков. Например:
    <?php
    header('WWW-Authenticate: Negotiate');
    header('WWW-Authenticate: NTLM', false);
    ?>
    

array headers_list ( void )

  • Возвращает список заголовков, передаваемых браузеру / клиенту. Для того, чтобы определить были ли переданы уже переданы заголовки, воспользуйтесь функцией headers_sent().
<?php

/* Функция setcookie() добавит заголовок сама по себе */
setcookie('foo', 'bar');

/* Определение пользовательского заголовка
   Это будет проигнорировано большинством клиентов */
header("X-Sample-Test: foo");

/* Передача простого текстового контента */
header('Content-type: text/plain');

/* Какие загловки готовы к отправке? */
var_dump(headers_list());
/*
array(4) {
  [0]=>
  string(23) "X-Powered-By: PHP/5.1.3"
  [1]=>
  string(19) "Set-Cookie: foo=bar"
  [2]=>
  string(18) "X-Sample-Test: foo"
  [3]=>
  string(24) "Content-type: text/plain"
}
*/
?>

bool headers_sent ([ string &$file [, int &$line ]] )

  • Проверяет были ли и куда отправлены заголовки.
  • Нельзя отправить дополнительные строки заголовков, используя функцию header() если заголовки уже были отправлены. Используя эту функцию, можно предупредить ошибки, связанные с HTTP заголовками.
  • Если опциональные параметры file и line установлены, то функция headers_sent() поместит имя файла PHP исходника и номер строки, с которой начинается вывод, в переменные file и line.
<?php

// Если не было отправлено ни одного заголовка, то отправить один
if (!headers_sent()) {
    header('Location: http://www.example.com/');
    exit;
}

void header_remove ([ string $name ] )

  • Удаляет предварительно установленный функцией header() HTTP заголовок.
  • Если не передан параметр, то удалит все заголовки.
  • Регистро-независима.
    <?php
    header("X-Foo: Bar");
    header("X-Bar: Baz");
    header_remove("X-Foo"); 
    ?>
    

get_headers($url [, $format = 0 ] )

  • Возвращает все заголовки из ответа сервера на HTTP-запрос.
  • Если необязательный параметр format установлен в ненулевое значение, get_headers() разберет ответ сервера и установит ключи для возвращаемого массива.

int http_response_code ([ int $response_code ] )

  • Если параметры не были отправлены, то http_response_code получит текущий код статуса. Код устанавливается если был отправлен параметр.
// Получает текущий код ответа по умолчанию
var_dump(http_response_code()); // int(200)

// Устанавливает заданный код ответа
http_response_code(404);

// Получает новый код ответа
var_dump(http_response_code()); // int(404)
?>

Компрессия

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

zlib.output_compression = on
zlib.output_compression_level = 9

Кэширование

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

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Thu, 31 May 1984 04:35:00 GMT");

Этот набор заголовков говорит браузеру или прокси не кешировать никаких данных, тем, что устанавливаем время жизни кеша в прошлом. Иногда же требуется кешировать данные на определенное время. Например pdf файл, сгенерированный на лету, должен содержать только актуальную информацию на определенный промежуток времени, после чего он должен быть перезагружен:

// 30 Days from now
$date = gmdate("D, j M Y H:i:s", time() + 2592000);
header("Expires: " . $date . " UTC");
header("Cache-Control: Public");
header("Pragma: Public");

Редирект

header("Location: http://phparch.com");

Этот код указывает клиенту перестать загружать содержимое страницы и перейти на другую. Чтобы быть уверенным, что больше ничего не выполнится, следует после совершить вызов exit:

header("Location: http://phparch.com");
exit;

Статусы

Код Определение
401 Unauthorized
403 Forbidden