Правильные HTTP заголовки. Готовим почву для SEO на этапе разработки! Смотреть что такое "Заголовки HTTP" в других словарях
Привет, читатель блога сайт! Продолжим знакомиться с протоколом HTTP в рубрике Серверы и протоколы и ее разделе . В данной публикации вы найдете все поля HTTP заголовков их описание и небольшие примеры. Возможно, в этой рубрике появится более подробные публикации про каждую из групп полей заголовка, пока я советую обратиться вам к официальной документации .
Поля HTTP заголовков запроса пользователя
Ниже приведены поля HTTP заголовка запроса пользователя , это те поля, которые могут быть использованы в . Обратите внимание на то, что в данной таблицы сведены поля HTTP заголовков при запросе и служебные поля HTTP заголовков запроса. Так же для удобства в справочнике поля заголовков HTTP запроса упорядочены в алфавитном порядке. В таблице будут приведены сначала служебные поля заголовка запроса, а затем поля заголовка объекта.
Поля HTTP заголовка | Описание поля HTTP заголовка | Пример |
Accept | Поле заголовка запроса Accept используется, чтобы определить тип информации, который должен содержаться в ответе | Accept: text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c |
Accept-Charset | Поле заголовка запроса Accept-Charset указывает на , которая должна быть в ответе сервера. Другими словами: данное поле указывает на то, какие наборы символов приемлемы для ответов сервера | Accept-Charset: iso-8859-5, unicode-1-1;q=0.8 |
Accept-Encoding | Поле заголовка запроса Accept-Encoding указывает серверу на то, какие способы кодирования приемлемы для ответа. | Accept-Encoding: compress, gzip |
Accept-Language | Поле заголовка запроса Accept-Language указывает серверу приемлемые языки (естественные языки: русский, китайский, английский и пр.) | Accept-Language: da, en-gb;q=0.8, en;q=0.7 |
Authorization | Поле заголовка запроса Authorization используется для отправки данных авторизации на сервер | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Content-Disposition | Поле заголовка запроса Content-Disposition используется для сохранения файлов на сервере | Content-Disposition: form-data; name="MessageTitle" Content-Disposition: form-data; name="AttachedFile1"; filename="photo-1.jpg" |
Expect | Поле заголовка запроса Expect позволяет клиенту задать поведение сервера, например, при помощи данного поля клиент может сообщить серверу, что ожидает от него дальнейших действий. | Expect: 100-continue |
From | Поле заголовка запроса From служит для передачи серверу адреса электронной почты клиента | From: [email protected] |
Host | Поле заголовка запроса Hostиспользуется для указания доменного имени и порта запрашиваемого ресурса. | Host: сайт |
If-Match | Поле заголовка запроса If-Match используется клиентом для эффективного обновления кэшируемой информации. В данном поле передается список тегов версий сущности (HTTP объекта) | If-Match: «xyzzy»
If-Match: «xyzzy», «r2d2xxxx», «c3piozzzz» If-Match: * |
If-Modified-Since | Поле заголовка запроса If-Modified-Since указывает на то, что сервер должен отправить объект, если он изменился с даты, указанной в заголовке. | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT |
If-None-Match | Поле заголовка запроса If-None-Match выполняется клиентом, у которого есть один или более объектов, ранее полученных из ресурса, может проверить, что ни один из тех объектов не является текущим, включая список их связанных тэгов объекта в поле заголовка If-None-Match | If-None-Match: «xyzzy»
If-None-Match: W/"xyzzy" If-None-Match: «xyzzy», «r2d2xxxx», «c3piozzzz» If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz" If-None-Match: * |
If-Range | Поле заголовка запроса If-Range используется клиентом в том случае, когда он имеет частичную копию объекта в его кэше, и желает иметь современную копию всего объекта | If-Range: «737060cd8c284d8af7ad3082f209582d» |
If-Unmodified-Since | Поле заголовка запроса If-Unmodified-Since используется клиентом если если запрошенный ресурс не был изменен со времени, указанного в этом поле. | If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT |
Max-Words | Поле заголовка запроса Max-Words используется , чтобы ограничить число прокси-серверов, иначе может получиться бесконечный цикл. | Max-Forwards: 10 |
Proxy-Authorization | Поле заголовка запроса Proxy-Authorization содержит в себе информацию для авторизации на прокси-сервере | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | Поле заголовка запроса Range указывает фрагмента ресурса, который требуется клиенту, чтобы не тянуть весь ресурс целиком | Range: bytes=50000-99999,250000-399999,500000- |
Referer | Поле заголовка запроса Referer содержит в себе URI ресурса (читай про ), с которого клиент перешел на данный ресурс | Referer: http://сайт |
TE | Поле заголовка запроса TE содержит список расширенных способов кодирования, поддерживаемых клиентом, для передачи. | TE: deflate
TE: trailers, deflate;q=0.5 |
User-Agent | Поле заголовка запроса User-Agent содержит в себе полную информацию о клиенте пользователя, например, о браузере. | User-Agent: CERN-LineMode/2.15 libwww/2.17b3 |
Content-Encoding | Поле заголовка запроса Content-Encoding указывает на дополнительный способ кодирования тела HTTP объекта с целью сжатия | Content-Encoding: gzip |
Content-Language | Поле заголовка запроса Content-Language указывает серверу на каком языке нужна информация (), находящаяся в теле объекта. | Content-Language: mi, en |
Content-Length | Поле заголовка запроса Content-Length указывает необходимую длину тела сообщения в байтах | Content-Length: 3495 |
Content-Location | Поле заголовка запроса Content-Location используется для идентификации исходного местоположения объекта на сервере. | «Content-Location» «:» (absoluteURI | relativeURI) |
Content-MD5 | Поле заголовка запроса Content-MD5 используется для проверки целостности объектов сообщений, так как хэш значительно меньше самого сообщения. | |
Content-Range | Поле заголовка запроса Content-Range используется в том случае, когда клиент запрашивает фрагмент . Данное поле имеет значение | |
Content-Type | Поле заголовка запроса Content-Type используется для указания в теле сообщения. | |
Content-Version | Поле заголовка запроса Content-Version содержит информацию о текущей версии HTTP объекта (обычно не реализуется) | |
Derived-From | Поле заголовка запроса Derived-From это аналог Content-Version (обычно не реализуется) | |
Expires | Поле заголовка запроса Expires содержит того момента, когда информация HTTP объекта перестанет быть актуальной | |
Last-Modified | Поле заголовка запроса Last-Modified содержит дату последней модификации HTTP объекта | |
Link | Поле заголовка запроса Link указывает на логически связный с сущностью ресурс (обычно не реализуетсяя) | |
Title | Поле заголовка запроса Title содержит заголовок объекта |
Поля HTTP заголовка ответа сервера
Ниже в таблицы приведены поля HTTP заголовка ответа сервера . Поля HTTP заголовка ответа сервера – это те поля, которые могут быть использованы в сервера на запросы клиента. Обратите внимание на то, что таблица содержит не только служебные поля заголовка ответа, но и поля заголовка HTTP объекта при ответе сервера.Сначала в таблицы идут служебные поля заголовка HTTP ответа, а затем поля заголовка HTTP объекта при ответе сервера. Справочник полей HTTP заголовка ответов сервера упорядочен в алфавитном порядке.
Поля HTTP заголовка | Описание поля HTTP заголовка | Пример |
Accept-Ranges | Поле заголовка ответа Accept-Ranges. Этим полем сервер сообщает клиенту о том, в каких единицах измерения тот может запрашивать фрагменты объекта | Accept-Ranges: bytes Accept-Ranges: none |
Age | Поле заголовка ответа Age хранит в себе количество секунд с момента последней модификации ресурса | |
Alternates | Поле заголовка ответа Alternates указывает на альтернативные способы представления ресурса и обычно не реализуется серверами. | |
Content-Disposition | Поле заголовка ответа Content-Disposition используется для сохранения файлов на | |
ETag | Поле заголовка ответа ETag идентифицирует | ETag: «56d-9989200-1132c580» |
Location | Поле заголовка ответа Location указывает URI, на котором хранится запрошенный ресурс | Location:absoluteURI |
Proxy-Authenticate | Поле заголовка ответа Proxy-Authenticate содержит в себе информацию о параметрах | Proxy-Authenticate:challenge |
Public | Поле заголовка ответа Public содержит в себе список доступных методов (читай про ) для всего HTTP сервера | Public: OPTIONS, MGET, MHEAD, GET, HEAD |
Retry-After | Поле заголовка ответа Retry-After обычно используется сервером вместе с кодом состояния 503 () и указывает на то, как долго ресурс будет недоступен | Retry-After: Fri, 31 Dec 1999 23:59:59 GMT Retry-After: 120 |
Server | Поле заголовка ответа Server содержит в себе необходимую информацию о сервере для установления | Server: /2.2.17 (Win32) PHP/5.3.5 |
Vary | Поле заголовка ответа Vary указывает клиенту на то, что HTTP объект имеет несколько источников и его содержимое может изменяться в зависимости от выбранного источника, указанного в URI | Vary: Accept-Language, Accept-Encoding |
WWW-Authenticate | Поле заголовка ответа WWW-Authenticate используется сервером вместе с 401 (). В данному поле указываются схемы аутентификации и требуемые параметры для доступа к ресурсу | WWW-Authenticate = «WWW-Authenticate» «:» 1#challenge |
Allow | Поле заголовка ответа Allow передает клиенту методы, которые тот может использовать | Allow: GET, HEAD, PUT |
Content-Encoding | Поле заголовка ответа Content-Encoding указывает на дополнительный способ кодирования тела HTTP объекта с целью сжатия | Content-Encoding: gzip |
Content-Language | Поле заголовка ответа Content-Language указывает клиенту на каком языке информация, находящаяся в теле объекта. | Content-Language: mi, en |
Content-Length | Поле заголовка ответа Content-Length указывает необходимую длину тела сообщения в байтах | Content-Length: 3495 |
Content-Location | Поле заголовка ответа Content-Location используется для идентификации исходного местоположения объекта на сервере. | |
Content-MD5 | Поле заголовка ответа Content-MD5 используется для проверки целостности объектов сообщений, так как хэш значительно меньше самого сообщения. | Content-MD5: |
Content-Range | Поле заголовка ответа Content-Range используется в том случае, когда клиент запрашивает фрагмент HTTP сообщение. Данное поле имеет значение байтового диапазона требуемого фрагмента | Content-Range: bytes 88080384-160993791/160993792 |
Content-Type | Поле заголовка ответа Content-Type используется для указания медиа типа данных в теле сообщения. | Content-Type: text/html;charset=utf-8 |
Content-Version | Поле заголовка ответа Content-Version содержит информацию о текущей версии HTTP объекта (обычно не реализуется) | |
Derived-From | Поле заголовка ответа Derived-From это аналог Content-Version (обычно не реализуется) | |
Expires | Поле заголовка ответа Expires содержит дату и время того момента, когда информация HTTP объекта перестанет быть актуальной | Expires: Tue, 31 Jan 2012 15:02:53 GMT |
Last-Modified | Поле заголовка ответа Last-Modified содержит дату последней модификации HTTP объекта | Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT |
Link | Поле заголовка ответа Link указывает на логически связный с сущностью ресурс (обычно не реализуетсяя) | |
Title | Поле заголовка ответа Title содержит заголовок объекта |
Общие поля HTTP заголовка
Напомню, что общие поля заголовка HTTP сообщения могут быть использованы, как при HTTP запросах, так и при ответах сервера. Ниже вы найдете таблицу с кратким описанием и примерами общих полей HTTP заголовка. Справочник общих полей HTTP заголовка отсортирован по алфавиту.
Поля HTTP заголовка | Описание поля HTTP заголовка | Пример |
Cache-Control | Общее поле HTTP заголовка Cache-Control определяет директивы для управления кэшем, которым должны следовать все кэширующие механизмы | Cache-Control: no-cache
Cache-Control: no-store Cache-Control: max-age=3600 Cache-Control: max-stale=0 Cache-Control: min-fresh=0 Cache-Control: no-transform Cache-Control: only-if-cached Cache-Control: cache-extension |
Connection | Общее поле HTTP заголовка Connection позволяет управлять HTTP соединением | Connection: close |
Date | Общее поле HTTP заголовка хранит дату и время создания HTTP сообщения | Date: Tue, 15 Nov 1994 08:12:31 GMT |
MIME-Version | Общее поле HTTPзаголовка MIME-Version содержит версия протокола MIME, по которому было сформировано сообщение. | MIME-Version = «MIME-Version» «:» 1*DIGIT «.» 1*DIGIT |
Pragma | Общее поле HTTP заголовка Pragma используется для включения особых директив, которые применяются к любому получателю HTTP сообщения. | Pragma: no-cache |
Trailer | Общее поле HTTP заголовка Trailer хранит в себе список полей, которые имеют отношение к кодированию сообщения и кодированию передачи. | Trailer:field-name |
Transfer-Encoding | Общее поле HTTP заголовка Transfer-Encoding служит для передачи списка методов кодирования передачи | Transfer-Encoding: chunked |
Upgrade | Общее поле HTTP заголовкаUpgrade служит для передачи версий , которые поддерживает клиент. Сервер на сообщение со списком отвечает сообщением с одним протоколом | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
Via | Общее поле HTTP заголовкаVia служит для отображения списка , названий и версий прокси-серверов, через которые прошло сообщение. | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Поля заголовка объекта HTTP сообщения
Напомню, что поля заголовка объекта HTTP сообщения используются для того, чтобы могли договориться между собой о том, как они будут обмениваться полезной для пользователя информацией и в каком виде эта информация будет представлена. Ниже в таблице в найдете поля заголовка объекта HTTP сообщения. Справочник полей заголовка объекта HTTP сообщения упорядочен по алфавиту.
Поля HTTP заголовка | Описание поля HTTP заголовка | Пример | Тип HTTP сообщения |
Allow | Поле заголовка Allow передает клиенту методы, которые тот может использовать | Allow: GET, HEAD, PUT | Ответ |
Content-Disposition | Поле заголовка Content-Disposition используется для сохранения файлов на сервере | Запрос и ответ | |
Content-Encoding | Поле заголовка Content-Encoding указывает на дополнительный способ кодирования тела HTTP объекта с целью сжатия | Content-Encoding: gzip | Запрос и ответ |
Content-Language | Поле заголовка Content-Language указывает клиенту на каком языке информация, находящаяся в теле объекта. | Content-Language: mi, en | Запрос и ответ |
Content-Length | Поле заголовка Content-Length указывает необходимую длину тела сообщения в байтах | Content-Length: 3495 | Запрос и ответ |
Content-Location | Поле заголовка Content-Location используется для идентификации исходного местоположения объекта на сервере. | «Content-Location» «:»absoluteURI | relativeURI) | Запрос и ответ |
Content-MD5 | Поле заголовка Content-MD5 используется для проверки целостности объектов сообщений, так как хэш значительно меньше самого сообщения. | Content-MD5: | Запрос и ответ |
Content-Range | Поле заголовка Content-Range используется в том случае, когда запрашивает фрагмент HTTP сообщение. Данное поле имеет значение байтового диапазона требуемого фрагмента | Content-Range: bytes 88080384-160993791/160993792 | Запрос и ответ |
Content-Type | Поле заголовка Content-Type используется для указания медиа типа данных в теле сообщения. | Content-Type: text/html;charset=utf-8 | Запрос и ответ |
Content-Version | Поле заголовка Content-Version содержит информацию о текущей версии HTTP объекта (обычно не реализуется) | Запрос и ответ | |
Derived-From | Поле заголовка Derived-From это аналог Content-Version (обычно не реализуется) | Запрос и ответ | |
Expires | Поле заголовка Expires содержит дату и время того момента, когда информация HTTP объекта перестанет быть актуальной | Expires: Tue, 31 Jan 2012 15:02:53 GMT | Запрос и ответ |
Last-Modified | Поле заголовка Last-Modified содержит дату последней модификации HTTP объекта | Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT | Запрос и ответ |
Link | Поле заголовка Link указывает на логически связный с сущностью ресурс (обычно не реализуется) | Запрос и ответ | |
Title | Поле заголовка Title содержит заголовок объекта | Запрос и ответ |
Не забывайте делиться своим мнением в комментариях и оставлять отзывы, это поможет сделать нашу работу лучше, с уважением !
Описание конкретных заголовков смотрите в статье Список заголовков HTTP .
Общий формат
Название : ЗначениеНазвание параметра должно состоять минимум из одного печатного символа (ASCII -коды от 33 до 126). Регистр символов в названиях не имеет значения. Заголовки с неизвестными именами должны игнорироваться. После названия сразу должен следовать символ двоеточия.
Значение может содержать любые символы ASCII кроме перевода строки (код 10) и возврата каретки (код 13). Пробельные символы в начале и конце значения обрезаются. Последовательность нескольких пробельных символов внутри значения может восприниматься как один пробел. Регистр символов также не имеет значения (если иное не предусмотрено форматом поля).
Предусматривается размещение значения на нескольких строках (перенос строки). Для указания переноса в начале следующей строки должен находиться хотя бы один пробельный символ.
Заголовки с одинаковыми названиями параметров, но разными значениями могут объединяться в один только если значение поля представляет из себя разделённый запятыми список. Во всех остальных случаях значения более дальних заголовов должны перекрывать предыдущие. Поэтому прокси-сервера не должны менять порядок следования заголовков в сообщении. При этом порядок элементов списка обычно значения не имеет.
Пример с многострочными значениями и одинаковыми именами заголовков (обратите внимание на регистр символов и пробелы):
Content-type: text/html; charset=windows-1251 Allow: GET, HEAD Content-Length: 356 ALLOW: GET, OPTIONS Content-Length: 1984
Правильный компактный вариант преобразования и интерпретации:
Content-Type: text/html;charset=windows-1251 Allow: GET,HEAD,OPTIONS Content-Length: 1984
В этом случае не допустимо принимать значение Content-Length равное 356. При объединении значений Allow чтобы не потерять семантический смысл была добавлена запятая в конец первого поля и убран бессмысленно дублирующийся элемент «GET».
Применяемые в заголовках структуры
Дата и время
Только дата указывается в заголовках Date , Expires , Last-Modified , If-Modified-Since , If-Unmodified-Since . Дата может присутствовать в заголовках If-Range и Warning .
В HTTP исторически используется три формата:
- Fri, 04 Jul 2008 08:42:36 GMT - RFC 822 .
- Friday, 04-Jul-08 08:42:36 GMT - RFC 850 .
- Fri Jul 4 08:42:36 2008 - результат функции asctime() языка ANSI C .
Сейчас рекомендуется использовать только первый формат по RFC 822 , но для совместимости клиентам и серверам лучше поддерживать и другие.
Время всегда указывается для часового пояса GMT (UTC+0). Год записывается четырьмя цифрами. День, час, минута и секунда дополняются нулями до двух символов. Для месяца и названия недели применяются трёхбуквенные стандартные сокращения на английском языке.
Дни недели начиная с понедельника: Mon , Tue , Wed , Thu , Fri , Sat , Sun .
Месяцы с января по декабрь: Jan , Feb , Mar , Apr , May , Jun , Jul , Aug , Sep , Oct , Nov , Dec .
В PHP для преобразования местного времени во время по Гринвичу используется функция gmdate(). Примеры формирования дат для заголовков HTTP:
// Текущая дата формирования документа: header ("Date: " . gmdate ("D, d M Y H:i:s" , time () ) . " GMT" ) ; // Дата модификации из указанного файла: $fp = "data/my-foo.txt" ; // путь к файлу header ("Last-Modified: " . gmdate ("D, d M Y H:i:s" , filemtime ($fp ) ) . " GMT" ) ; // Документ предположительно изменится через час: header ("Expires: " . gmdate ("D, d M Y H:i:s" , time () + 3600 ) . " GMT" ) ; // 3600 - количество секунд относительно текущего момента.
Байтовые диапазоны
При работе с фрагментами содержимого в специальных заголовках используются байтовые диапазоны (англ. byte ranges ). В них можно указать как один фрагмент, так и несколько разделяя их запятыми « , ». Диапазоны применяются в заголовках Range и Content-Range . В заголовке Accept-Ranges перечисляются только единицы измерения.
В байтовых диапазонах обязательно в начале указываются название единиц измерения за которым следует символ « = ». В настоящий момент кроме единиц bytes никакие другие не применяются. За символом « = » располагаются сами диапазоны. Каждый из них является разделённой дефисом « - » парой натуральных чисел или нуля. Первый элемент указывает начальный байт, а второй - конечный. Нумерация в диапазонах начинается с нуля.
Начальный или конечный байт может быть не указан. При отсутствии последнего байта считается что речь идёт о фрагменте от начального байта до конца содержимого. Если отсутствует начало, то номер конечного байта воспринимается как количество запрашиваемых байт от конца содержимого.
Если первый байт больше чем последний, то диапазон считается неправильным. Диапазоны с недопустимыми значениями игнорируются. Если первый байт выходит за пределы объёма ресурса, то диапазон игнорируется. Если последний байт выходит за пределы содержимого, то диапазон обрезается до конца.
Блок байтовых диапазонов считается выполнимым если в нём содержится хотя бы один доступный диапазон. Если же все диапазоны некорректны или выходят за пределы объёма ресурса, то серверу следует вернуть сообщение со статусом 416 (Requested range not satisfiable).
Примеры (весь объём ресурса - 5000 байт):
- bytes=0-255 - фрагмент от 0-го до 255-го байта включительно.
- bytes=42-42 - запрос одного 42-ого байта.
- bytes=4000-7499,1000-2999 - два фрагмента. Так как первый выходит за пределы, то он интерпретируется как « 4000-4999 ».
- bytes=3000-,6000-8055 - первый интерпретируется как « 3000-4999 », а второй игнорируется.
- bytes=-400,-9000 - последние 400 байт (от 4600 до 4999), а второй подгоняется под рамки содержимого (от 0 до 4999) обозначая как фрагмент весь объём.
- bytes=500-799,600-1023,800-849 - при пересечениях диапазоны могут объединяться в один (от 500 до 1023).
Работа с заголовками
Заголовки в HTML
Язык разметки HTML позволяет задавать необходимые значения заголовков HTTP внутри
с помощью тэга . При этом название заголовка указывается в атрибуте http-equiv , а значение - в content . Почти всегда выставляется значение заголовка Content-Type с указанием кодировки чтобы избежать проблем с отображением текста браузером. Так же не лишним является указание значения заголовка Content-Language:<html > <head > <meta http-equiv = "Content-Type" content = "text/html;charset=windows-1251" > <meta http-equiv = "Content-Language" content = "ru" > ...
Итак, усвоив материал, представленный на данном сайте, и выполнив самостоятельные попытки по изучению HTML и CSS вы должны уметь создавать веб-странички начальной и близкой к начальной сложности. Но, я считаю, важно не только уметь выполнять поставленные задачи, но также понимать как ваши решения работают на всех уровнях организации. Приблизить вас к этому поможет инструмент для просмотра HTTP-заголовков, отправляемых вашим браузером веб-серверу и наоборот.
В упомянутой выше статье помимо теоретической информации были приведены также листинги HTTP-заголовков, используемых браузером при запросе главной страницы сайта ya.ru и содержащихся в ответе веб-сервера на соответствующий запрос. Но гораздо интереснее (и полезнее) посмотреть, чем отвечает ваш сервер на запросы браузером ваших страничек. Позже, при создании "умных" HTML-страниц это станет ключом к пониманию принципов активного взаимодействия пользователя и сайта.
В качестве инструмента для просмотра HTTP-заголовков я предлагаю использовать плагин к браузеру FireFox LiveHTTPHeaders . Установить его можно так: Инструменты - Дополнения - Поиск дополнений, ищем по слову "headers", устанавливаем LiveHTTPHeaders. После перезагрузки браузера появится новая функция: Инструменты - Просмотр HTTP-заголовков.
Предлагаю опробовать плагин на странице, созданной на предыдущем уроке . Открываем окно "Просмотр HTTP-заголовков", жмем "очистить", чтобы убрать появившиеся заголовки (при запросе домашней страницы браузера и т.п.). Далее делаем запрос страницы, например, http://test-domain2/. В окне заголовков появились заголовки от запросов браузера и от ответов веб-сервера:
Запись представляет собой три блока: сначала идет URL запрашиваемой страницы, затем, через пустую строку, HTTP-заголовки, находящиеся в HTTP-запросе данной страницы и, наконец, HTTP-заголовки, находящиеся в HTTP-ответе веб-сервера. Записи разделены между собой линиями.
Чтобы сформировать веб-страницу браузер делает несколько запросов к веб-серверу: непосредственно кода страницы, файлов CSS-стилей, изображений и т.п. Все эти запросы отражены в форме. Первым идет запрос HTML-страницы:
GET / HTTP/1.1 Host: test-domain2 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache
на что сервер ответил:
HTTP/1.1 200 OK Date: Fri, 04 Jun 2010 08:52:09 GMT Server: Apache Last-Modified: Wed, 26 May 2010 11:34:58 GMT Etag: "3000000002878-20ca-4877da9e71c80" Accept-Ranges: bytes Content-Length: 8394 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html; charset=UTF-8
В заголовке HTTP-ответа можно увидеть название веб-сервера, размер страницы в байтах, ее кодировку. Напомню, что плагин отображает HTTP-заголовки, который является частью HTTP-пакета. Вторая его часть - тело пакета, не отображается. Но тут все просто: обычные запросы страниц/файлов не имеют в пакете тела (а о необычных мы узнаем позже), а тело в ответе представляют собой содержимое запрашиваемой страницы/файла, которое и получает браузер.
Заголовки HTTP используются для "общения" браузера и web-сервера, например, когда браузер запрашивает какой-либо документ, он посылает заголовок GET, а когда сервер возвращает тип документа, то он делает это ни как-нибудь, а в заголовке Content-type.
Мы уже частично рассматривали заголовки протокола HTTP, но теперь остановимся на них подробнее.
Итак, приведем список и краткое описание основных заголовков HTTP.
Заголовок Accept
Заголовок Accept предназначен для информирования сервера о типах данных, которые поддерживаются клиентом (браузером). В этом заголовке браузер перечисляет, какие типы документов он "понимает". Пере-
числение идет через запятую.
Используется переменная окружения HTTP_ACCEPT. Пример использования:
Accept: text/html, text/plain, image/jpeg
В последнее время вместо списка указывается значение *.*, что означает "все типы".
Заголовок Content-type
Данный заголовок предназначен для идентификации типа передаваемых данных. При этом заголовок Content-type использует переменную окружения CONTENT_TYPE. Обычно для этого заголовка указывается значение application/x-www-form-urlencoded. Таким образом, указывается формат, в котором все управляющие символы (т.е. символы, не являющиеся алфавитно-цифровыми) специально кодируются. О некоторых других MIME-типах вы можете узнать .
Это тот самый формат передачи, который используется методами GET и POST .
Довольно распространен и другой формат, multipart/form-data.
Сервер никак не интерпретирует рассматриваемый заголовок, а просто передает его сценарию через переменную окружения.
Пример: Content-type: text/plain
Заголовок Content-length
Этот заголовок содержит строку, в которой записана длина передаваемых данных в байтах при использовании метода передачи POST. За заголовком закреплена одноименная переменная CONTENT_LENGTH.
Если задействуется метод GET, то этот заголовок отсутствует, и значит, переменная окружения не устанавливается.
Заголовок Cookie
В этом заголовке хранятся все Cookies . Данный заголовок использует переменную окружения HTTP_COOKIE. Для установки Cookies используется заголовок Set-Cookie.
Заголовок GET
Об этом заголовке мы упоминали ранее.
Заголовок GET использует следующие переменные окружения:
- REQUEST_URI - запрашиваемый идентификатор ресурса;
- QUERY_STRING - передаваемые сценарию параметры;
- REQUEST_METHOD - метод передачи информации. В данном случае эта переменная будет содержать значение GET.
Заголовок Location
Получив заголовок Location вместе с указанным в нем URL, сервер немедленно переходит по указанному URL, не дожидаясь, пока тело документа загрузится:
Пример: Location: http://www.somehost.com/
Заголовок POST
Этот заголовок использует те же переменные окружения, что и заголовок GET (переменная REQUEST_METHOD содержит значение POST). Напомним, что данные методом POST можно передавать в конце заголовков.
Напомним формат заголовка POST: POST сценарий?параметры HTTP/1.0
Заголовок Pragma
Данный заголовок используется для различных целей, одна из которых - это запрет кэширования документа.
Пример заголовка: Pragma: no-cache
Заголовок Server
Данный заголовок содержит название и версию программного обеспечения сервера. Например:
Server: Apache/1.3.23 (Unix) (Red-Hat/Linux) mod_ssl/2.8.7 OpenSSL/0.9.6b Dav/1.0.3 PHP/4.3.0 mod_perl/1.26 configured
Заголовок Referer
С помощью этого заголовка можно узнать ссылающийся на нас сервер. Это бывает полезно, когда нам необходимо узать обратные ссылки, например, при анализе эффективности сетевой рекламы.
Заголовок User-Agent
Содержит версию браузера. Например: User-Agent: Mozilla/5.0 (compatible; Konqueror/3.0.0-10; Linux).
Переменная окружения: HTTP_REFERER.
Некоторые комментарии по HTTP-заголовкам
Мы ознакомились с названиями заголовков и соответствующим им переменным окружения.
Необходимо помнить основные приципы:
- Все символы в верхнем регистре;
- В начале имен добавляется HTTP_
- Символы "-" заменяются знаком подчеркивания "_".
Передача заголовков HTTP в PHP
В PHP есть встроенные функции для работы с заголовками HTTP.
Для передачи заголовков HTTP предназначена функция header()
Приведем практические примеры:
header
(" Content-type: text/plain
"
);
?>
header ("Location: http://www.example.com/" ); /* Производит перенаправление браузера на другой ресурс */
/* Внимание! Убедитесь, что код, расположенный ниже не исполняется */
exit;
?>
// Date in the past
header
("Expires: Mon, 26 Jul 1997 05:00:00 GMT"
);
// always modified
header
("Last-Modified: "
.
gmdate
("D, d M Y H:i:s"
) .
" GMT"
);
// HTTP/1.1
header
("Cache-Control: no-store, no-cache, must-revalidate"
);
header
("Cache-Control: post-check=0, pre-check=0"
,
false
);
// HTTP/1.0
header
("Pragma: no-cache"
);
?>
С помощью заголовков http происходит обмен служебными сведениями между клиентом и сервером. Эта информация остается невидимой для пользователей, но без нее невозможна правильная работа браузера. Для обычных пользователей сведения об этом и о задачах http заголовков покажутся довольно сложными, но на самом деле они не содержат трудных формулировок. Это то, с чем сталкивается веб-пользователь ежедневно.
заголовки?
«Протокол передачи гипертекста» - именно так переводится http заголовок. Благодаря его существованию, возможна связь «клиент-сервер». Если объяснить простыми словами, пользователь браузера посылает запрос, инициируя соединение с сервером. Последний, по умолчанию, ждет запрос от клиента, обрабатывает его и посылает обратно итоговую информацию или ответ. В поисковой строке пользователь «вбивает» адрес сайта, который начинается с http:// и получает результат в виде открывшейся страницы.
Когда печатается адрес сайта в соответствующей строке, браузер находит требующийся сервер с помощью DNS. Сервер распознает http заголовок (один или несколько), который посылает ему клиент, а затем выдает требуемый header. Набор обязательных состоит из уже существующих заголовков и не найденных.
В общем, http заголовки достаточно эффективные. Их не видно в HTML-кодировании, они отправляются перед запрашиваемыми сведениями. Многие заголовки автоматически высылаются сервером. Для того чтобы его отослать на языке PHP, следует воспользоваться функцией header.
Взаимодействие браузера и сайта
Схема взаимодействия браузера и сайта достаточно простая. Так, http заголовок начинает строку запроса, который далее посылается серверу. В ответ приходит нужная клиенту информация. Между прочим, уже семнадцать лет - самый используемый в Интернете. Он простой, надежный, работает быстро и гибко. Главная задача http - запрос сведений с web-сервера. Клиентом является браузер, а сервером - ligthttp, apache, nginx. Если соединение между ними произошло успешно, сервер в ответ на запрос получает нужные сведения. Информация http содержит текстовые, звуковые файлы, видео.
Протокол может быть транспортом для других. Запрос клиента состоит из трех частей:
- стартовой строки (тип сообщения);
- заголовков (параметры сообщения);
- тела информации (сообщение, которое отделяется пустой строчкой).
Стартовая строка - обязательный элемент запроса поля заголовков http. Структура запроса пользователя состоит из трех основных частей:
- Метод. С его помощью указывается тип запроса.
- Путь (path). Это строка URL, которая следует за доменом.
- Используемый протокол. Он состоит из версии protocol и http.
Современные браузеры используют версию 1.1. Далее следуют заголовки в формате "Имя: значение".
HTTP-кэширование
Суть в том, что кэширование обеспечивает хранение HTML-страниц, других файлов в кэше (место в операционной памяти, на жестком диске компьютера). Это нужно для того чтобы ускорить к ним повторный доступ и сэкономить трафик.
Кэш имеет браузер клиента, промежуточный шлюз и прокси-сервер. Перед тем как отправить сообщение по URL, браузер проверит наличие объекта в кэше. Если объекта нет, запрос передается следующему серверу, где проверяется кэширование http заголовков на сервере nginx. Шлюзы и прокси используются разными пользователями, поэтому кэш является разделяемым.
HTTP-кэширование способно не только существенно ускорить работу сайта, но и предоставить старую версию страницы. С помощью происходит отправка заголовков на отклик. При этом не может быть кэширована информация, запрошенная по протоколу HTTPS.
Описание http заголовков
Одними из самых главных механизмов кеша считаются http заголовки expires. Эти заголовки сообщают о сроке годности предоставленной в отклике информации. В них указывается время и дата, когда кэш будет считаться устаревшим. Например, такой заголовок выглядит следующим образом: Expires: Wen, 30 Nov 2016 13:45:00 GMT. Данная структура используется почти везде, в том числе для кэширования страниц и картинок. Если пользователь выберет старую дату, сведения не будут кэшироваться.
Заголовки http proxy относятся к категории header link. Они не кэшируются по умолчанию. Чтобы кэш работал правильно, каждый URL должен соответствовать одному варианту содержимого. Если страница действует на двух языках, каждая версия должна иметь собственный URL. Заголовок vary сообщает кэшу названия заголовков запроса. К примеру, если отображение запроса зависит от браузера, серверу необходимо также отправлять заголовок. Таким образом, в кэше сохраняются разные варианты запросов и типы документов. TTP заголовок accept необходим для того чтобы составлять списки допустимых форматов используемого ресурса, с ним достаточно легко работать, так как он отсеивает ненужные.
Всего существует четыре группы заголовков, которые передают служебную информацию. Это основные заголовки - они содержатся в любом сообщении сервера и клиента, запроса и ответа, а также сущности. Последние описывают содержание любого сообщения от клиента и сервера.
HTTP заголовок authorization считается дополнительным. Когда web-страница спрашивает у клиента авторизацию, браузер отображает специальное окно с полями для ввода логина и пароля. После того как пользователь введет свои данные, браузер передает запрос http. Он содержит заголовок «авторизация».
Как увидеть заголовки?
Чтобы увидеть http заголовок, необходимо установить плагины для браузера, например, firefox:
- Firebug. Просмотреть заголовки можно во вкладке net (сеть), где выбрать all (все). Этот плагин обладает функциями, которые будут полезны веб-разработчику.
- Live http headers. Простой плагин, предназначенный для просмотров http заголовков. С его помощью вручную можно сгенерировать запрос.
- Пользователи Ghrome легко увидят заголовки, если нажмут кнопку настроек, выберут инструменты разработчика (net works).
Когда плагины будут установлены, запустите их и браузера.
Методы запросов
Методы, которые используются в HTTP, имеют сходства с инструкциями, которые передаются в виде сообщения серверу. Это специальное слово на английском языке.
- Метод GET. Его используют для запроса информации с ресурса. Именно с него начинаются все действия.
- POST. С его помощью происходит отправка данных. Например, сообщение в социальной сети или комментарий, браузер помещает в тело POST-запроса и отправляет серверу.
- HEAD. Метод имеет сходства с первым, но выполняет легкую функцию. Он запрашивает только мета-данные, исключая из ответа сообщение. Методом пользуются, если хотят получить информацию о файлах без скачивания. Его используют, если хотят проверить работоспособность ссылок на сервере.
- PUT. Загружает данные на URL. Передает большие объемы данных.
- OPTIONS. Работает с конфигурациями сервера.
- URI. Идентифицирует ресурс и содержит в себе URL.
Структура http ответа
Сервер отвечает на запросы клиента длинными сообщениями. Ответ состоит из нескольких строк, в которых указывается версия протокола, код статуса сервера (200). Он говорит о том, что изменилось на сервере за время обработки поступившего запроса:
- Статус «двести» указывает на успешную обработку информации. После этого сервер отправляет документ клиенту. Остальные строчки запроса указывают на другую информацию о передаваемых сведениях.
- Если файл не найден или не существует, сервер посылает клиенту код 404, его еще называют ошибкой.
- Код 206 указывает на частичное скачивание файла, которое можно возобновить спустя время.
- Код 401 свидетельствует об отказе в авторизации. Это означает, что запрашиваемая страница защищена паролем, который следует ввести для подтверждения входа.
- О запрещенном доступе, говорит код 403. Запреты на просмотры, скачивание файлов или видео - распространенный ответ в Интернете.
- Существуют также другие версии кодов: временное перемещение запрашиваемого файла, внутренняя ошибка сервера, окончательное перемещение. В этом случае, пользователь будет перенаправлен. Если появился код 500, это означает, что в работе сервера появились сбои.
URL - что это?
URL - это сердце веб-общения между клиентом и сервером. Запрос обычно отправляется через URL - единый указатель ресурсов. Структура запроса url очень проста. Она состоит из нескольких элементов: протокол http (заголовок), hoot (адрес сайта), port, resourte path и query.
Протокол доступен также для безопасного соединения https и обмена информацией. URL-адрес содержит информацию о размещении конкретного сайта в Интернете. Адрес включает в себя имя домена, путь к странице, а также ее название.
Основной недостаток работы с URL - это неудобное взаимодействие с латинским алфавитом, а также цифрами и символами. В SEO оптимизации играет не последнюю роль.
Активным пользователям компьютеров и разработчикам не помещает ознакомиться с некоторыми профессиональными рекомендациями, которые дают специалисты в этой области:
- Обозначайте сроки годности файлов и документов, с учетом обновлений. Статистическая информация указывается в больших значениях max-age.
- Отдельный документ должен быть доступен лишь по одному URL.
- Если обновляете файл, который будет скачиваться пользователем, измените его имя и ссылку на него. Это гарантирует скачивание нового, а не устаревшего документа.
- Заголовки Last-Modified должны соответствовать настоящей дате последних изменений содержания. Не следует пересохранять страницы и документы, если не будете их менять.
- Используйте POST-запросы лишь там, где это нужно. Сведите к минимуму работу с SSL.
- Заголовки перед отправкой сервером следует проверять плагином REDbot.