Блог вечного странника

HTTP - заголовки

16 сентября 2015, 12:09

HTTP - заголовки

В соответствии со спецификацией http, этот протокол поддерживает передачу служебной информации от сервера к броузеру, оформленной в виде специальных заголовков.

Таким образом, http headers - это средство общения сервера с удаленным клиентом. Каждый заголовок обычно состоит из одиночной линии ascii текста с именем и значением. Сами заголовки никак не отображаются в окне броузера, но зачастую могут сильно изменить отображение сопутствующего документа.

Механизм отправки http заголовков в php.
Механизм отправки заголовков в php представлен функцией header(). Особенность протокола http заключается в том, что заголовок должен быть отправлен до посылки других данных, поэтому функция должна быть вызвана в самом начале документа и должна выглядеть следующим образом:

header("http заголовок"[, replace]);

Необязательный параметр replace может принимать значения (true или false) и указывает на то, должен ли быть заменен предыдущий заголовок подобного типа, либо добавить данный заголовок к уже существующему.

В отношении функции header() часто применяется функция headers_sent(), которая в качестве результата возвращает true в случае успешной отправки заголовка и false в обратном случае.

Рассмотрим наиболее используемые http заголовки.

Cache-control

"cache-control: " значение

Заголовок управления кешированием страниц. Вообще, данная функция является одной из самых распространенных в использовании заголовков.

    Данный заголовок может быть использован со следующими значениями:
  • no-cache - Запрет кеширования. Используется в часто обновляемых страницах и страницах с динамическим содержанием. Его действие подобно meta тегу "pragma: no-cache".
  • public - Разрешение кеширования страницы как локальным клиентом, так и прокси-сервером.
  • private - Разрешение кеширования только локальным клиентом.
  • max-age - Разрешение использования кешированного документа в течение заданного времени в секундах.
  • no-store - Cтраница содержит приватные данные, сохранять в кэше нельзя!
// Кеширование локальными клиентами и использование в течение 1 часа
header("cache-control: private, max-age = 3600");
echo "

", date("H:i:s"), "

";

// кеширования всеми серверами на 1 час
header("Cache-Control: public");
header("Expires: " . date("r", time() + 3600));
echo "

", date("H:i:s"), "

";

Совсем жесткий запрет кеширования на всех этапах:

header("Cache-Control: no-store, no-cache, must-revalidate");
header("Expires: " . date("r"));
echo "

", date("H:i:s"), "

";

Кеширование с помощью файла .htaccess

Expires

"expires: " http-date

Устанавливает дату и время, после которого документ считается устаревшим. Дата должна указываться в следующем формате (на английском языке):

День недели (сокр.) число (2 цифры) Месяц (сокр.) год часы:минуты:секунды gmt

Например, fri, 09 jan 2002 12:00:00 gmt

Текущее время в этом формате возвращает функция gmdate() в следующем виде:

echo gmdate("d, d m y h:i:s")." gmt";

Возможно использование данного http заголовка для запрета кеширования. Для этого необходимо указать прошедшую дату. Иногда можно встретить и такую комбинацию Expires: now

Last-modified

last-modified: http-date

Указывает дату последнего изменения документа. Дата должна задаваться в том же формате, что и в случае с заголовком expires. Данный заголовок можно не использовать для динамических страниц, так как многие серверы (например, apache) для таких страниц сами выставляют дату модификации.

При запросе это значение передаётся клиентом в специальном заголовке запроса: If-Modified-Since. Обработчик запроса может проверить, изменился ли объект, и если нет - вернуть ответ с пустым телом и кодом ответа 304 Not Modified. Само содержимое страницы не передаётся, и клиент будет использовать то содержимое, которое хранится у него в кэше.

Возможно сделать страницу всегда обновленной:

header("last-modified: ".gmdate("d, d m y h:i:s")." gmt");

ETag

ETag'и (Entity Tags - тэги сущностей) - механизм, который используют браузеры и веб-сервера, чтобы определить, является ли объект, находящийся в кэше браузера таким же, как соответствующий объект на сервере (а Entity (сущность) - другое название того, что мы называем компонентами: картинки, скрипты и т.д.). Тэги сущностей были задуманы как механизм для определения актуальности сущности в кэше браузера, что является более гибким подходом, нежели проверка по дате последнего изменения (last-modified). ETag - это строка, которая однозначно идентифицирует конкретную версию компонента. Единственное требование: строка должна быть заключена в двойные кавычки. Сервер указывает ETag для компонента используя HTTP-заголовок ETag:
HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195

Позднее, если браузер хочет определить актуальность компонента, он передает заголовок If-None-Match для передачи ETag'а обратно на сервер. Если ETag'и совпадают, ответ от сервера приходит со статус-кодом 304, уменьшая таким образом объем передачи на 12195 байт:

GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified

Включить ETag для Apache можно, например, следующей директивой:

FileETag MTime Size
Открючить ETag для Apache:
FileETag none

Location

"location :" абсолютный url

Полезный заголовок, который перенаправляет броузер на указанный адрес. Его действие сравнимо с meta тегом refresh:

header("location: http://htmlweb.ru");

Например, этот заголовок может быть использован так:

if ($login != $admin_login) header("location: http://www.server.com/login.php");
else header("location: http://www.server.com/admin.php?login=$login");
if (!headers_sent()) exit("Произошла ошибка! Пройдите авторизацию заново");

Content-type

Content-type : MIME тип возвращаемого документа
header("Content-type: text/html");

Content-length

Content-length : размер возвращаемого документа

Status

Status : MIME тип возвращаемого документа Эта директива используется для задания серверу HTTP/1.0 строки-статус, которая будет послана клиенту. Формат: nnn xxxxx, где nnn - 3-х цифровой статус-код, и xxxxx строка причины, например: "Forbidden" (Запрещено). Http-коды статусов.
header("http/1.0 200 Ok");

Content-Encoding

Content-Encoding : gzip Способность принимать сжатое содержимое клиент отправляет серверу с помощью заголовка Accept-Encoding: gzip. Обычно сервер указывает Accept-Encoding: gzip,deflate.

Range

Задать диаппазон скачиваемой информации
header("Range: bytes=1024-");

Разрешить кросс-доменные запросы

header('Access-Control-Allow-Origin: *');
header('Access-Control-Max-Age: 600'); // время в секундах кеширования разрешения
Подробнее см. http://www.w3.org/TR/cors/#access-control-allow-origin-response-hea Пример использования Gzip-сжатия

Другие статьи категории «Про SEO»

Асинхронная загрузка скриптов. Атрибут async

В связи с недавним падением Яндекса многие ощутили минусы наличия счетчиков метрики, рекламы от директа, т.к. многие сайты просто отказывались грузиться или висели очень долго.

Учебное пособие по кэшированию, часть 1

Веб-кэш располагается между одним или несколькими веб-серверами и клиентом, или множеством клиентов, и следит за входящими запросами, сохраняя при этом копии ответов — HTML-страниц, изображений и файлов (совокупно известных, как представления (representations); прим.
Комментарии к этой заметке больше не принимаются.
Все заметки категории «Про SEO»