Здравствуйте, уважаемые посетители сайта ZametkiNaPolyah.ru. Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе HTTP протокол. В этой заметки мы поговорим про то, как сервер понимает, что мы обращаемся именно к нему и какой ресурс он нам должен выдать. Для этого в HTTP есть параметр URI, который может указать не только имя ресурса, к которому мы хотим обратиться, но и его местоположение.

Про URI я планирую отдельный пост, в котором мы разберем все особенности, сейчас я надеюсь на то, что у вас есть понимание того, что есть URI. Но для начала дадим определение URI. URI (Uniform Resource Identifier) – унифицированный идентификатор ресурса, другими словами – это последовательность символов, которая однозначно определяет ресурс в сети (необязательно Интернет).

Использование параметра URI в HTTP протоколе

Если вы хотите узнать всё про протокол HTTP, обратитесь к навигации по рубрике HTTP протокол. Еще одним параметром в HTTP является URI ресурса, к которому клиент делает HTTP запрос. В качестве URI может выступать URL, в этом случае у нас есть еще и информация о местонахождение ресурса или URN, который идентифицирует ресурс, но никак не определяет его местонахождение. URI в HTTP это обычная строка, которая записывается в определенном формате, еще мы можем сказать, что URI в HTTP может быть представлен в двух формах: абсолютной и относительной. Абсолютная форма URI в HTTP начинается с имени схемы. Относительная форма URI в HTTP не включает в себя имя схемы. Общий синтаксис URI в HTTP представлен в листинге ниже.

[php]

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>

[/php]

Вот такая вот ужасная конструкция, чтобы ее целиком понять, необходимо детально изучить URI и принципы кодирования.  Для ясности приведем пример эквивалентных URI в HTTP:

[php]

http://site.ru:80/~cat/home.html

http://site.ru/%7cat/home.html

http://site.ru:/%7ecat/home.html

[/php]

Давайте теперь рассмотрим, как сервер HTTP должен работать с URI.

Работа серверов 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 запроса слишком длинный.

URL в HTTP протоколе

Рассмотрим теперь частный случай URI в HTTP – URL, URL это не только частный случай URI в HTTP, но и самый частый случай. Выше я уже привел пример URL в HTTP, теперь давайте посмотрим общий синтаксис URL, допустимый в HTTP:

[php] http_URL       = «http:» «//» host [ ":" port ] [ abs_path ][/php]

[php]

host           = <допустимое доменное имя машины

или IP адрес (в точечно-десятичной форме),

как определено в разделе 2.1 RFC 1123>

 

port           = *DIGIT

[/php]

Добавим, что если вы не указали порт, то по умолчанию будет использован порт 80 для установки HTTP соединения и последующего обсуждения. Это означает, что идентифицированный ресурс размещен в сервере, ожидающем TCP соединений на специфицированном порте port, компьютера host, и запрашиваемый URI ресурса — abs_path. А вот использование IP-адресов в URL следует избегать, так говорит нам стандарт HTTP.

Правила сравнения URI в HTTP

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

  1. Если порт пуст или не указан в URI, то он эквивалентен заданному по умолчанию порту для URI.
  2. Сравнения имен хостов должно производиться без учета регистра символов.
  3. Сравнение имен схем должно производиться без учета регистра.
  4. Пустой abs_path эквивалентен ''/''.

Зарезервированные и опасные символы должны кодироваться в URI.

Возможно, эти записи вам покажутся интересными


Выберете удобный для себя способ, чтобы оставить комментарий

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Loading Disqus Comments ...