Здравствуйте, уважаемые посетители сайта 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 клиент должен выполнять четыре правила:
- Если порт пуст или не указан в URI, то он эквивалентен заданному по умолчанию порту для URI.
- Сравнения имен хостов должно производиться без учета регистра символов.
- Сравнение имен схем должно производиться без учета регистра.
- Пустой abs_path эквивалентен ''/''.
Зарезервированные и опасные символы должны кодироваться в URI.
Выберете удобный для себя способ, чтобы оставить комментарий