HTTP запрос, или сообщение состоит из трех частей: строки запроса, и тела HTTP сообщения.

Строка запроса , или стартовая строка: в запросе к серверу — строка, которая содержит тип запроса (метод), URI запрашиваемой страницы, и версия (например HTTP/1.1). В ответе от сервера эта строка содержит версию HTTP протокола, и код ответа. Код ответа представляет собой целое число из трех цифр. За ним обычно следует отделённая пробелом поясняющая фраза, поясняющая код, например: 200 OK, или 404 Not Found.

Методы (типы) HTTP запроса : GET, POST, PUT, PATCH, HEAD, DELETE, TRACE. Чаще всего в HTTP запросе используются методы GET, или POST: GET — используется для запроса содержимого web-страницы по указанному URI. URI — это адрес страницы без указания , например: /internet/chto-takoe-http-zapros-soobshhenie/ вместо сайт/internet/chto-takoe-http-zapros-soobshhenie/. Браузер может передавать параметры в GET в URI после символа « ? »: GET /index.php?param1=value1¶m2=value2. Кроме обычного метода GET, различают ещё условный GET и частичный GET. Условные запросы GET содержат заголовки If-Modified-Since , If-Match , If-Range и подобные.

POST — используется для отправки информации, на . При отправке данных методом POST, они указываются в теле HTTP сообщения, а не в строке ввода адреса в браузере, как это делается при передаче данных методом GET. Например, при отправке комментария через форму, которая расположена под статьей, информация на сервер передается именно методом POST. Так же с помощью метода POST загружают файлы на сервер.

— это часть запроса, в котором содержатся различные параметры, которые используются для правильного построения web-страницы.

Тело HTTP сообщения — содержит полученные от сервера данные, например сформированную web-страницу в виде HTML кода, либо ресурс, например картинку.

Пример HTTP сообщений:

HTTP запрос к серверу:

GET /internet/chto-takoe-http-zapros-soobshhenie/ HTTP/1..9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2150.0 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: wp-settings-1=hidetb%3D; wp-settings-time-1=1424958215; wordpress_test_cookie=WP+Cookie;

Ответ от сервера:

HTTP/1.1 200 OK - стартовая строка ответа : Server: nginx/1.6.2 Date: Sun, 19 Apr 2015 00:22:50 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 9431 Connection: keep-alive Keep-Alive: timeout=30 X-Powered-By: PHP/5.5.22 Expires: Wed, 11 Jan 1984 05:00:00 GMT Cache-Control: no-cache, must-revalidate, max-age=0 Pragma: no-cache Vary: Accept-Encoding Content-Encoding: gzip Далее следует тело ответа (страница в HTML).

Мы определились с тем, что браузер (клиент) отправляет серверу HTTP запросы, а сервер отправляет клиенту HTTP ответы. Эти запросы и ответы оформляются по определенным правилам. Есть, что-то вроде синтаксиса, как и в какой последовательности, должно быть написано. Должна быть строго определенная структура.

Давайте более подробно рассмотрим эту структуру, по которой строятся запросы и ответы в протоколе HTTP.

HTTP запрос состоит из трех основных частей, которые идут в нем именно в том порядке, который указан ниже. Между заголовками и телом сообщения находится пустая строка (в качестве разделителя), она представляет собой символ перевода строки.

1. строка запроса (Request Line)

2. заголовки (Message Headers)

Пустая строка (разделитель)

3. тело сообщения (Entity Body) – необязательный параметр

Строка запроса – указывает метод передачи, URL-адрес, к которому нужно обратиться и версию протокола HTTP.

Заголовки – описывают тело сообщений, передают различные параметры и др. сведения и информацию.

тело сообщения — это сами данные, которые передаются в запросе. Тело сообщения – это необязательный параметр и может отсутствовать.

Когда мы получаем ответный запрос от сервера, тело сообщения, чаще всего представляет собой содержимое веб-страницы. Но, при запросах к серверу, оно тоже может иногда присутствовать, например, когда мы передаем данные, которые заполнили в форме обратной связи на сервер.

Более подробно, каждый элемент запроса, мы рассмотрим в следующих заметках.

Давайте, для примера, рассмотрим один реальный запрос к серверу. Я выделил каждую часть запроса своим цветом: строка запроса — зеленый, заголовки — оранжевый, тело сообщения- голубой.

Запрос от браузера:

GET / HTTP/1.1

Host: сайт

User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Cookie: wp-settings

Connection: keep-alive

В следующем примере уже присутствует тело сообщения.

Ответ сервера:

HTTP/1.1 200 OK

Content-Type: text/html; charset=UTF-8

Transfer-Encoding: chunked

Connection: keep-alive

Keep-Alive: timeout=5

Server: Apache

X-Pingback: //сайт/xmlrpc.php

Документ без названия

Вот такими сообщениями обмениваются клиент и сервер по протоколу HTTP.

Кстати, я настраиваю отчеты, цели и события в системах Яндекс Метрика и Google Analytics.

Вашему вниманию предлагается описание основных аспектов протокола HTTP - сетевого протокола, с начала 90-х и по сей день позволяющего вашему браузеру загружать веб-страницы. Данная статья написана для тех, кто только начинает работать с компьютерными сетями и заниматься разработкой сетевых приложений, и кому пока что сложно самостоятельно читать официальные спецификации.

HTTP - широко распространённый протокол передачи данных, изначально предназначенный для передачи гипертекстовых документов (то есть документов, которые могут содержать ссылки, позволяющие организовать переход к другим документам).

Аббревиатура HTTP расшифровывается как HyperText Transfer Protocol , «протокол передачи гипертекста». В соответствии со спецификацией OSI , HTTP является протоколом прикладного (верхнего, 7-го) уровня. Актуальная на данный момент версия протокола, HTTP 1.1, описана в спецификации RFC 2616 .

Протокол HTTP предполагает использование клиент-серверной структуры передачи данных. Клиентское приложение формирует запрос и отправляет его на сервер, после чего серверное программное обеспечение обрабатывает данный запрос, формирует ответ и передаёт его обратно клиенту. После этого клиентское приложение может продолжить отправлять другие запросы, которые будут обработаны аналогичным образом.

Задача, которая традиционно решается с помощью протокола HTTP - обмен данными между пользовательским приложением, осуществляющим доступ к веб-ресурсам (обычно это веб-браузер) и веб-сервером. На данный момент именно благодаря протоколу HTTP обеспечивается работа Всемирной паутины.

Также HTTP часто используется как протокол передачи информации для других протоколов прикладного уровня, таких как SOAP, XML-RPC и WebDAV. В таком случае говорят, что протокол HTTP используется как «транспорт».

API многих программных продуктов также подразумевает использование HTTP для передачи данных - сами данные при этом могут иметь любой формат, например, XML или JSON.

Как правило, передача данных по протоколу HTTP осуществляется через TCP/IP-соединения. Серверное программное обеспечение при этом обычно использует TCP-порт 80 (и, если порт не указан явно, то обычно клиентское программное обеспечение по умолчанию использует именно 80-й порт для открываемых HTTP-соединений), хотя может использовать и любой другой.

Как отправить HTTP-запрос?

Самый простой способ разобраться с протоколом HTTP - это попробовать обратиться к какому-нибудь веб-ресурсу вручную. Представьте, что вы браузер, и у вас есть пользователь, который очень хочет прочитать статьи Анатолия Ализара.

Предположим, что он ввёл в адресной строке следующее:

Http://alizar.habrahabr.ru/

Соответственно вам, как веб-браузеру, теперь необходимо подключиться к веб-серверу по адресу alizar.habrahabr.ru.

Для этого вы можете воспользоваться любой подходящей утилитой командной строки. Например, telnet:

Telnet alizar.habrahabr.ru 80

Сразу уточню, что если вы вдруг передумаете, то нажмите Ctrl + «]», и затем ввод - это позволит вам закрыть HTTP-соединение. Помимо telnet можете попробовать nc (или ncat) - по вкусу.

После того, как вы подключитесь к серверу, нужно отправить HTTP-запрос. Это, кстати, очень легко - HTTP-запросы могут состоять всего из двух строчек.

Для того, чтобы сформировать HTTP-запрос, необходимо составить стартовую строку, а также задать по крайней мере один заголовок - это заголовок Host, который является обязательным, и должен присутствовать в каждом запросе. Дело в том, что преобразование доменного имени в IP-адрес осуществляется на стороне клиента, и, соответственно, когда вы открываете TCP-соединение, то удалённый сервер не обладает никакой информацией о том, какой именно адрес использовался для соединения: это мог быть, например, адрес alizar.habrahabr.ru, habrahabr.ru или m.habrahabr.ru - и во всех этих случаях ответ может отличаться. Однако фактически сетевое соединение во всех случаях открывается с узлом 212.24.43.44, и даже если первоначально при открытии соединения был задан не этот IP-адрес, а какое-либо доменное имя, то сервер об этом никак не информируется - и именно поэтому этот адрес необходимо передать в заголовке Host.

Стартовая (начальная) строка запроса для HTTP 1.1 составляется по следующей схеме:

Например (такая стартовая строка может указывать на то, что запрашивается главная страница сайта):

Ну и, конечно, не забывайте, что любая технология становится намного проще и понятнее тогда, когда вы фактически начинаете ей пользоваться.

Удачи и плодотворного обучения!

Теги: Добавить метки

Начиная со второй версии 8 платформы, у пользователей и разработчиков появилась возможность использования непосредственно в 1С http запрос. При этом программа поддерживает два типа запросов:

  • POST запросы;
  • GET запросы.

Таким образом, был создан достаточно удобный инструмент для обмена данными и взаимодействия с веб сервисами и службами, работающими через http.

GET запрос

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

  1. Получим тело главной страницы нашего сайта;
  2. Отработаем перенаправление запроса;
  3. Заберем картинку с сайта.

Получение тела сайта

Начнем с простого. На Рис..

Результатом выполнения этого участка кода является достаточно большой текст, конечный участок которого отображен на Рис.2.

Рис.2

В первой строке кода мы создаем объект соединения с http ресурсом. Объект может содержать следующие свойства:

  • Сервер — строка подключения, содержащая адрес сервера;
  • Порт – содержит число, указывающее на порт сервера, по умолчанию, в зависимости от типа подключения, можно указать 80 для незащищенных соединений или 443 для защищенных SSL.
  • Имя пользователя – указывается, если необходима авторизация на сервере;
  • Пароль – пароль пользователя на указанном ресурсе;
  • Прокси – может содержать объект типа ИнтернетПрокси, указывается, когда для связи с сервером используется прокси;
  • ЗащищенноеСоединение – по умолчанию имеет значение ЛОЖЬ, переключение в ИСТИНА указывает на использование https протокола.

Кроме этого, у объекта HTTPСоединение существуют свои методы, обращение к которым позволяет более полно описать алгоритм выполнения обработчика:

  • ВызватьHTTPметод – содержит два обязательных параметра HTTPметод и HTTPзапрос, поддерживает возможность записи тела ответа в файл, указанный в третьем параметре;
  • Записать – с помощью PUT запроса отправляет данные на сервер;
  • Изменить – изменяет объект, обрабатывая PATCH запросы;
  • ОтправитьДляОбработки – метод указывающий на использование POST запроса, как и во всех предыдущих методах, обязательно должен содержать текст запроса, так же может передавать адрес файла ответа для записи данных;
  • Получить – о нем подробнее будет рассказано ниже;
  • ПолучитьЗаголовки – еще один метод, который будет использован в статье;
  • Удалить – фактически это запрос Delite, который удаляет переданный в запросе ресурс с сервера.

Второй строкой мы создаем запрос к выбранному сайту, текст нашего обращения содержит один слэш, а это значит, что мы хотим получить главную страницу. Если бы следом за слешем шло какое-либо выражение, например «page2» или «news» мы бы получили другую страницу.

Третья строка выполняет наш запрос к серверу.

В четвертой мы показываем результат.

Отработка перенаправления http запроса

Представим ситуацию, когда нам надо программно получить результат поиска через любую поисковую систему по ключу «Запросы в 1с». Участок кода, необходимый для обращения к GOOGLE указан на рис.3

Рис.3

Здесь помимо уже знакомых нам конструкций присутствуют Заголовки и КодСостояния. Разберемся с ними.

КодСостояния – стандартная величина, оговоренная в «Request for Comments» , может принимать следующие значения:

  1. Если все нормально вернется значение в диапазоне от 100 до 299;
  2. В случае перенаправления вернется код в диапазоне от 300 до 399, в нашем случае удачное постоянное перенаправление на ресурс определится кодом 301;
  3. При ошибках в запросе параметр примет значение от 400 до 499;
  4. Значение в области 500-599 указывает на проблемы с сервером.

У каждой страницы есть заголовок, в тексте которого можно выделить несколько параметров (Рис.4):

  1. Схему подключения (все, что идет до двух слешей «//»);
  2. Адресную строку соединения;
  3. Имя пользователя и пароль;
  4. Порт и хост для подключения.

Именно эту разбивку выполняет функция РазбитьСтрокуАдреса. Получив, таким образом, новый адрес, мы можем сохранить страницу на нашем компьютере и открыть её в браузере по умолчанию (процедура ПолучитьСтраницу).

Рис.5

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

Файл мы помещаем в корень диска D и называем test.

Забираем картинку с сайта

Возникает естественный вопрос: если нам не нужен весь сайт целиком, а необходимо получить только отдельные его элементы, можно ли это сделать и как? Да можно. Код программы, позволяющий это сделать, представлен на Рис.6

Рис.6

Как видно из рисунка, в теле запроса у нас представлен код элемента структуры сайта, который нам необходимо получить. Этой части не было в нашем предыдущем описании и на этом моменте нужно остановиться подробнее.

Мы использовали браузер Opera для доступа к сайту. В нем имеется один важный для нас инструмент, при щелчке правой кнопкой мыши на элементе, можно вызвать контекстное меню, один из пунктов которого «Посмотреть код элемента».

Именно благодаря ему, мы можем получить адрес, который будет использоваться в запросе Рис.7.

POST-запрос

В отличие от несложных Get запросов, POST http запросы имеют текстовое тело, которое может храниться как в обычном текстовом виде, так и в виде файлов с расширением xml, soap, json. В сети достаточно много инструментов для создания текстов запроса, которые позволяют отлаживать и мониторить исполнение тех или иных обращений.

В 1С для того, чтобы запустить запрос с определенным текстом, у объекта HTTPзапрос есть процедура УстановитьТелоИзСтроки.

Являетесь вы программистом или нет, вы видели его повсюду в Интернете. На данный момент в адресной строке браузера отображается нечто, что начинается с «http: //». Даже ваш первый скрипт Hello World отправил HTTP-header без вашего понимания. В этой статье мы собираемся узнать об основах HTTP-заголовков и о том, как их можно использовать в наших веб-приложениях.

Что такое HTTP Headers?

HTTP значит "Hypertext Transfer Protocol" (Протокол передачи гипертекста). Всемирная паутина использует этот протокол. Он был создан в начале 1990-х годов. Почти всё, что вы видите в вашем браузере, передаётся на ваш компьютер через HTTP. Например, когда вы открыли страницу этой статьи, ваш браузер отправил более 40 HTTP-запросов и получил HTTP-ответы для каждого из них.

Заголовки HTTP являются основной частью этих HTTP-запросов и ответов, и они несут информацию о браузере клиента, запрошенной странице, сервере и многом другом.

Пример

Когда вы вводите URL-адрес в адресной строке, ваш браузер отправляет HTTP-запрос, и он может выглядеть так:

GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 Host: net.tutsplus.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120 Pragma: no-cache Cache-Control: no-cache

Первая строка - это "Request Line", которая содержит некоторую базовую информацию по запросу. Остальные - HTTP заголовки.

После этого запроса ваш браузер получает ответ HTTP, который может выглядеть так:

HTTP/1.x 200 OK Transfer-Encoding: chunked Date: Sat, 28 Nov 2009 04:36:25 GMT Server: LiteSpeed Connection: close X-Powered-By: W3 Total Cache/0.8 Pragma: public Expires: Sat, 28 Nov 2009 05:36:25 GMT Etag: "pub1259380237;gz" Cache-Control: max-age=3600, public Content-Type: text/html; charset=UTF-8 Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT X-Pingback: http://net.tutsplus.com/xmlrpc.php Content-Encoding: gzip Vary: Accept-Encoding, Cookie, User-Agent Top 20+ MySQL Best Practices - Nettuts+

Первая строка - это «Строка состояния», за которой следуют «HTTP-заголовки», до пустой строки. После этого начинается «содержимое» (в данном случае - HTML вывод).

Когда вы смотрите на исходный код веб-страницы в своём браузере, вы видите только часть HTML, а не заголовки HTTP, хотя они фактически были переданы вместе.

Эти HTTP-запросы также отправляются и принимаются для других вещей, таких как изображения, CSS-файлы, файлы JavaScript и т. д. Именно поэтому я сказал ранее, что ваш браузер отправил не менее 40 или более HTTP-запросов, поскольку вы загрузили только эту страницу статьи.

Теперь давайте рассмотрим структуру более подробно.

Как увидеть HTTP Headers

Для анализа HTTP-заголовков я использую следующие расширения Firefox:

Заголовки HTTP в запросах HTTP

Теперь мы рассмотрим некоторые из наиболее распространенных HTTP headers , найденных в HTTP requests.

Почти все эти заголовки можно найти в массиве $ _SERVER в PHP. Вы также можете использовать функцию getallheaders() для извлечения всех заголовков одновременно.

Host

HTTP-запрос отправляется на определенные IP-адреса. Но так как большинство серверов способны размещать несколько сайтов под одним IP, они должны знать, какое доменное имя ищет браузер.

Host: net.tutsplus.com

Это в основном имя host, включая домен и поддомен.

В PHP его можно найти, как $_SERVER["HTTP_HOST"] или $_SERVER["SERVER_NAME"].

User-Agent

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)

Этот заголовок может содержать несколько частей информации, таких как:

  • Имя и версия браузера.
  • Название и версия операционной системы.
  • Язык по умолчанию.

Именно так веб-сайты могут собирать определённую общую информацию о своих системах surfers. Например, они могут определить, использует ли surfer мобильный браузер и перенаправляет их на мобильную версию своего веб-сайта, который лучше работает с низким разрешением.

В PHP может быть выражен так: $_SERVER["HTTP_USER_AGENT"].

If (strstr($_SERVER["HTTP_USER_AGENT"],"MSIE 6")) { echo "Please stop using IE6!"; }

Accept-Language

Accept-Language: en-us,en;q=0.5

Этот заголовок отображает настройки языка по умолчанию. Если сайт имеет разные языковые версии, он может перенаправить нового surfer на основе этих данных.

В PHP его можно найти так: $ _SERVER ["HTTP_ACCEPT_LANGUAGE"].

If (substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2) == "fr") { header("Location: http://french.mydomain.com"); }

Accept-Encoding

Accept-Encoding: gzip,deflate

Большинство современных браузеров поддерживают gzip и отправляют это в header. Затем веб-сервер может отправить выходной HTML-код в сжатом формате. Это позволяет уменьшить размер до 80% для экономии пропускной способности и времени.

В PHP его можно найти так: $ _SERVER ["HTTP_ACCEPT_ENCODING"]. Однако, когда вы используете функцию обратного вызова ob_gzhandler() , она будет проверять значение автоматически, поэтому вам это не нужно.

// enables output buffering // and all output is compressed if the browser supports it ob_start("ob_gzhandler");

If-Modified-Since

Если веб-документ уже сохранен в кеше в браузере и вы посещаете его снова, ваш браузер может проверить, был ли документ обновлён, отправив следующее:

Если он не изменялся с этой даты, сервер отправляет код ответа «304 Not Modified», а содержимое - нет, и браузер загружает содержимое из cache.

В PHP его можно найти так: $ _SERVER ["HTTP_IF_MODIFIED_SINCE"].

// assume $last_modify_time was the last the output was updated // did the browser send If-Modified-Since header? if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) { // if the browser cache matches the modify time if ($last_modify_time == strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"])) { // send a 304 header, and no content header("HTTP/1.1 304 Not Modified"); exit; } }

Существует также HTTP-заголовок Etag, который можно использовать для проверки текущего кэша. Мы поговорим об этом в ближайшее время.

Cookie

Как следует из названия, это отправляет файлы cookie, хранящиеся в вашем браузере для этого домена.

Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar

Это пары name=value, разделённые точками с запятой. Cookies могут также содержать id сеанса.

В PHP отдельные cookie-файлы могут быть доступны с помощью массива $ _COOKIE. Вы можете напрямую обращаться к переменным сеанса, используя массив $ _SESSION, и если вам нужен id сеанса, вы можете использовать функцию session_id () вместо cookie.

Echo $_COOKIE["foo"]; // output: bar echo $_COOKIE["PHPSESSID"]; // output: r2t5uvjq435r4q7ib3vtdjq120 session_start(); echo session_id(); // output: r2t5uvjq435r4q7ib3vtdjq120

Referer

Как следует из названия, этот HTTP header содержит ссылочный url.

Например, если я зашел на домашнюю страницу Nettuts + и нажал ссылку на статью, этот header будет отправлен в мой браузер:

Referer: http://net.tutsplus.com/

В PHP его можно найти как $ _SERVER ["HTTP_REFERER"].

If (isset($_SERVER["HTTP_REFERER"])) { $url_info = parse_url($_SERVER["HTTP_REFERER"]); // is the surfer coming from Google? if ($url_info["host"] == "www.google.com") { parse_str($url_info["query"], $vars); echo "You searched on Google for this keyword: ". $vars["q"]; } } // if the referring url was: // http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9 // the output will be: // You searched on Google for this keyword: http headers

Возможно, вы заметили, что слово «referrer» написано с ошибкой, как «referer». К сожалению, он превратился в официальную спецификацию HTTP подобным образом и застрял.

Authorization

Authorization: Basic bXl1c2VyOm15cGFzcw==

Данные внутри header имеют кодировку base64. Например, base64_decode ("bXl1c2VyOm15cGFzcw ==") возвратит "myuser: mypass"

В PHP эти значения можно найти как $ _SERVER ["PHP_AUTH_USER"] и $ _SERVER ["PHP_AUTH_PW"].

Подробнее об этом будет, когда мы поговорим о заголовке WWW-Authenticate.

Заголовки HTTP в ответах HTTP

Теперь мы рассмотрим некоторые из наиболее распространенных HTTP headers, найденных в HTTP-ответах.

В PHP вы можете установить заголовки ответа, используя функцию header() . PHP уже отправляет определённые заголовки автоматически, для загрузки содержимого и настройки файлов cookie и прочее... Вы можете увидеть headers, которые отправляются или будут отправляться с помощью функции headers_list () . Вы можете проверить, были ли уже отправлены заголовки с помощью функции headers_sent() .

Cache-Control

Определение из w3.org: «Поле заголовка Cache-Control используется для указания директив, которые ДОЛЖНЫ выполняться всеми механизмами кэширования по цепочке запросов/ответов». Эти «механизмы кэширования» включают шлюзы и прокси, которые может использовать ваш интернет-провайдер.

Cache-Control: max-age=3600, public

"public" означает, что ответ может быть кэширован кем угодно. "max-age" указывает, сколько секунд действителен кеш. Разрешение кэширования вашего сайта может снизить нагрузку на сервер и пропускную способность, а также увеличить время загрузки в браузере.

Кэширование также может быть предотвращено с помощью директивы "no-cache".

Cache-Control: no-cache

Content-Type

Этот header указывает "mime-type" документа. Затем браузер определяет, как интерпретировать содержимое на основании этого. Например, страница html (или PHP-скрипт с выходом html) может возвращать это:

Content-Type: text/html; charset=UTF-8

"text" - это тип, а "html" - подтип документа. Заголовок также может содержать больше информации, такой как charset.

Для gif-изображения это может быть отправлено.

Content-Type: image/gif

Браузер может использовать внешнее приложение или расширение браузера на основе mime-type. Например, это приведет к загрузке Adobe Reader:

Content-Type: application/pdf

При загрузке напрямую Apache обычно может обнаружить mime-тип документа и отправить соответствующий header. Кроме того, большинство браузеров имеют некоторую степень отказоустойчивости и автоопределение типов mime, если заголовки указаны неверно или отсутствуют.

Вы можете найти список общих типов mime .

В PHP вы можете использовать функцию finfo_file() для определения mime-типа файла.

Content-Disposition

Этот header указывает браузеру открыть окно загрузки файла, вместо того, чтобы пытаться проанализировать содержимое. Пример:

Content-Disposition: attachment; filename="download.zip"

Это заставит браузер сделать это:

Обратите внимание, что соответствующий заголовок Content-Type также должен быть отправлен вместе с этим:

Content-Type: application/zip Content-Disposition: attachment; filename="download.zip"

Content-Length

Когда контент будет передаваться браузеру, сервер может указать его размер (в байтах), используя этот header.

Content-Length: 89123

Это особенно полезно при загрузке файлов. Именно так браузер может определить ход загрузки.

Например, вот сценарий-макет, который я написал, имитирует медленную загрузку.

// it"s a zip file header("Content-Type: application/zip"); // 1 million bytes (about 1megabyte) header("Content-Length: 1000000"); // load a download dialogue, and save it as download.zip header("Content-Disposition: attachment; filename="download.zip""); // 1000 times 1000 bytes of data for ($i = 0; $i < 1000; $i++) { echo str_repeat(".",1000); // sleep to slow down the download usleep(50000); }

Вот результат:

Теперь я собираюсь закомментировать заголовок Content-Length

// it"s a zip file header("Content-Type: application/zip"); // the browser won"t know the size // header("Content-Length: 1000000"); // load a download dialogue, and save it as download.zip header("Content-Disposition: attachment; filename="download.zip""); // 1000 times 1000 bytes of data for ($i = 0; $i < 1000; $i++) { echo str_repeat(".",1000); // sleep to slow down the download usleep(50000); }

Теперь результат такой:

Браузер может только сказать, сколько байтов было загружено, но он не знает общую сумму. И индикатор выполнения не показывает прогресс.

Etag

Это еще один header, который используется для кеширования. Это выглядит так:

Etag: "pub1259380237;gz"

Веб-сервер может отправлять этот header с каждым документом, который он обслуживает. Значение может быть основано на последней изменённой дате, размере файла или даже контрольной сумме файла. Браузер затем сохраняет это значение, так как он кэширует документ. В следующий раз, когда браузер запрашивает тот же файл, он отправляет это в HTTP-запросе:

If-None-Match: "pub1259380237;gz"

Если значение Etag документа совпадает с этим, сервер будет отправлять код 304 вместо 200, и никакого содержимого. Браузер будет загружать содержимое из своего кеша.

Last-Modified

Как следует из названия, этот header указывает дату последнего изменения документа в формате GMT:

Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT $modify_time = filemtime($file); header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT");

Это предлагает браузеру другой способ для cache документа. Браузер может отправить это в HTTP-запросе:

Мы уже говорили об этом ранее в разделе "If-Modified-Since".

Location

Этот заголовок используется для перенаправления. Если код ответа 301 или 302, сервер также должен отправить этот header. Например, когда вы перейдете на страницу http://www.nettuts.com , ваш браузер получит следующее:

HTTP/1.x 301 Moved Permanently ... Location: http://net.tutsplus.com/ ...

В PHP вы можете перенаправить surfer так:

Header("Location: http://net.tutsplus.com/");

По умолчанию, это отправит 302 код ответа. Если вы хотите вместо 301 отправить:

Header("Location: http://net.tutsplus.com/", true, 301);

Set-Cookie

Когда веб-сайт хочет установить или обновить файл cookie в вашем браузере, он будет использовать этот header.

Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT

Каждый файл cookie отправляется как отдельный header. Обратите внимание, что файлы cookie, установленные с помощью JavaScript, не проходят через HTTP headers.

В PHP вы можете установить cookie-файлы, используя функцию setcookie() , а PHP отправляет соответствующие HTTP headers.

Setcookie("TestCookie", "foobar");

Что приводит к отправке этого заголовка:

Set-Cookie: TestCookie=foobar

Если дата истечения срока действия не указана, cookie удаляется, когда окно браузера закрыто.

WWW-Authenticate

Сайт может отправить этот header для аутентификации пользователя через HTTP. Когда браузер увидит этот header, он откроет диалоговое окно входа в систему.

WWW-Authenticate: Basic realm="Restricted Area"

Что будет выглядеть так: