Как получить или отправить специальные HTTP-заголовки в PHP?

как получить или отправить специальные http-заголовки в php?

Отправка заголовков

В большинстве случаев отправкой основных HTTP-заголовков занимается веб-сервер. Например, он автоматически определяет размер данных, предназначенных для ответа, и формирует заголовок с именем Content-Lenght. Так же в зависимости от настроек веб-сервера возможна автоматическая отправка заголовков безопасности, сжатия данных и кеширования.

Существует ряд задач, которые требуют отправки специфичных заголовков с помощью PHP. Реализация полностью зависит от вашего приложения. Например, если вы создаете REST API, то захотите изменить заголовок Content-Type на значение application/json. Это позволит принимающей стороне однозначно идентифицировать тип полученных данных как JSON-объект.

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

Заголовок может быть одного из двух видов. Первый устанавливает статус HTTP-ответа. Например, всем известная ошибка 404 (страница не найдена) задается строкой «HTTP/1.0 404 Not Found». Второй способ записи имеет вид «имя-заголовка: значение-заголовка».

Если попытаться установить два заголовка с одинаковыми именами, но различными значениями, функция header() отправит только последний. Вы можете задать второй параметр функции в логическое значение true, что отменит перезаписывание.

Как говорилось выше, для определения статуса ответа можно использовать вызов header() с первым параметром вида «HTTP/1.0 404 Not Found». Однако функция принимает третий числовой параметр, который отвечает за отправку статуса ответа. Вы можете одновременно задавать любой вид заголовка и указывать код ответа.

//Редирект страницы с помощью заголовков
header('HTTP/1.1 301 Moved Permanently');
header('Location: /another-page-address');

//Установка типа возвращаемых данных
header('Content-Type: application/json');

//Отправка задвоенного заголовка аутентификации
header('WWW-Authenticate: Basic realm="http://example.com"');
header('WWW-Authenticate: OAuth realm="http://example.com"', true);

Важно
PHP накладывает ограничения на использование функции header(). Заголовки могут быть установлены, если клиенту ещё не передавались данные. То есть не было вызовов echo, print, не подключались файлы с разметкой. Даже наличие пробела между началом файла и открывающей конструкцией <?php завершит вызов header() с ошибкой.

Решить данную проблему можно с помощью буферизации вывода. Это позволит устанавливать заголовки в любом месте скрипта.

Удаление заголовков

Иногда возникает потребность удалить один или несколько ранее установленных заголовков. Специально для этого существует функция header_remove(). Она принимает всего один строковой параметр — имя заголовка.

Перед удалением вы можете убедиться были ли отправлены заголовки. Функция headers_sent() возвращает логическое значение true, если отправка осуществлена или false в противном случае.

//Установка заголовка для дальнейшего удаления
header('Content-Type: application/json');

if (!headers_sent()) {
    header_remove('Content-Type');
}

Получение заголовков

При получении запроса веб-сервером заголовки передаются новому процессу PHP. Они автоматически добавляются в суперглобальный массив $_SERVER. Все имена заголовков перед размещением в $_SERVER переводятся в верхний регистр и дополняются приставкой HTTP_. Например, User-Agent будет преобразован в HTTP_USER_AGENT.

Если вы используете веб-сервер Apache и хотите получить заголовки с изначальными именами, используйте функцию getallheaders(). Она возвращает ассоциативный массив, ключи которого заданы в изначальном виде или false в случае ошибки.

//Получение строки, идентифицирующей браузер
echo $_SERVER['HTTP_USER_AGENT'];

//Вывод всех заголовков, полученных с запросом
//Действует только с веб-сервером Apache
foreach (getallheaders() as $name => $value) {
    echo "{$name}: {$value}";
}

Последние публикации