Тема 1: Знакомство с HTTP протоколом
Здравствуйте, уважаемые посетители сайта ZametkiNaPolyah.ru. Начнем знакомиться с протоколом HTTP в рубрике Серверы и протоколы…
Здравствуйте, уважаемые посетители сайта ZametkiNaPolyah.ru. Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе HTTP протокол. В этой заметки мы поговорим про то, как сервер понимает, что мы обращаемся именно к нему и какой ресурс он нам должен выдать. Для этого в HTTP есть параметр URI, который может указать не только имя ресурса, к которому мы хотим обратиться, но и его местоположение.
Про URI я планирую отдельный пост, в котором мы разберем все особенности, сейчас я надеюсь на то, что у вас есть понимание того, что есть URI. Но для начала дадим определение URI. URI (Uniform Resource Identifier) – унифицированный идентификатор ресурса, другими словами – это последовательность символов, которая однозначно определяет ресурс в сети (необязательно Интернет).
Содержание статьи:
Если вы хотите узнать всё про протокол HTTP, обратитесь к навигации по рубрике HTTP протокол. Еще одним параметром в HTTP является URI ресурса, к которому клиент делает HTTP запрос. В качестве URI может выступать URL, в этом случае у нас есть еще и информация о местонахождение ресурса или URN, который идентифицирует ресурс, но никак не определяет его местонахождение. URI в HTTP это обычная строка, которая записывается в определенном формате, еще мы можем сказать, что URI в HTTP может быть представлен в двух формах: абсолютной и относительной. Абсолютная форма URI в HTTP начинается с имени схемы. Относительная форма URI в HTTP не включает в себя имя схемы. Общий синтаксис URI в HTTP представлен в листинге ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
URI = ( absoluteURI | relativeURI ) [ "#" fragment ] absoluteURI = scheme ":" *( uchar | reserved ) relativeURI = net_path | abs_path | rel_path net_path = "//" net_loc [ abs_path ] abs_path = "/" rel_path rel_path = [ path ] [ ";" params ] [ "?" query ] path = fsegment *( "/" segment ) fsegment = 1*pchar segment = *pchar params = param *( ";" param ) param = *( pchar | "/" ) scheme = 1*( ALPHA | DIGIT | "+" | "-" | "." ) net_loc = *( pchar | ";" | "?" ) query = *( uchar | reserved ) fragment = *( uchar | reserved ) pchar = uchar | ":" | "@" | "&" | "=" | "+" uchar = unreserved | escape unreserved = ALPHA | DIGIT | safe | extra | national escape = "%" HEX HEX reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" extra = "!" | "*" | "'" | "(" | ")" | "," safe = "$" | "-" | "_" | "." unsafe = CTL | SP | <"> | "#" | "%" | "<" | ">" national = <любой OCTET за исключением ALPHA, DIGIT, reserved, extra, safe, и unsafe> |
Вот такая вот ужасная конструкция, чтобы ее целиком понять, необходимо детально изучить URI и принципы кодирования. Для ясности приведем пример эквивалентных URI в HTTP:
1 2 3 4 5 |
http://site.ru:80/~cat/home.html http://site.ru/%7cat/home.html http://site.ru:/%7ecat/home.html |
Давайте теперь рассмотрим, как сервер HTTP должен работать с URI.
Более полную информацию про URI, URL, URN вы сможете найти в скором времени на моем сайте, сейчас же я вам порекомендую обратиться к RFC 1738 и RFC 1808. Важной особенностью URI в HTTP протоколе является то, что HTTP серверы должны уметь работать с URI, состоящих из символов и не соответствующих RFC 1738.
Серверы HTTP могут работать с URI любой длины, стандарт в этом отношении никаких ограничений не накладывает. HTTP сервер должен уметь обработать URI любого ресурса, который он обслуживает. HTTP серверам следует уметь обрабатывать URI неограниченной длины, если они работают с формами при помощи метода GET. HTTP серверу следует возвращать код состояния 414 (код ошибки клиента), если URI запроса слишком длинный.
Рассмотрим теперь частный случай URI в HTTP – URL, URL это не только частный случай URI в HTTP, но и самый частый случай. Выше я уже привел пример URL в HTTP, теперь давайте посмотрим общий синтаксис URL, допустимый в HTTP:
1 |
http_URL = "http:" "//" host [ ":" port ] [ abs_path ] |
1 2 3 4 5 6 7 8 9 |
host = <допустимое доменное имя машины или IP адрес (в точечно-десятичной форме), как определено в разделе 2.1 RFC 1123> port = *DIGIT |
Добавим, что если вы не указали порт, то по умолчанию будет использован порт 80 для установки HTTP соединения и последующего обсуждения. Это означает, что идентифицированный ресурс размещен в сервере, ожидающем TCP соединений на специфицированном порте port, компьютера host, и запрашиваемый URI ресурса — abs_path. А вот использование IP-адресов в URL следует избегать, так говорит нам стандарт HTTP.
При сравнении двух URI на стороне клиента следует использовать чувствительное к регистру побайтное сравнение заданных URI. При этом HTTP клиент должен выполнять четыре правила:
Зарезервированные и опасные символы должны кодироваться в URI.
Выберете удобный для себя способ, чтобы оставить комментарий