Параметры протокола. Версия HTTP
HTTP использует схему нумерации "<major>.<minor>" для отображения версии протокола. Политика присвоения версии протоколу ориентирована на то, чтобы позволить отправителю указать формат сообщения и его емкость. Номер версии не меняется при добавлении компонент сообщения, которые не влияют на характер обмена.
Число <minor> увеличивается, когда в протокол внесены изменения, которые не изменили общий алгоритм разбора сообщений, но изменили семантику сообщений и добавили новые возможности отправителю. Число <major> увеличивается в случае, когда изменен формат протокольного сообщения.
Версия HTTP-сообщения указывается в поле HTTP-Version в первой строке сообщения.
HTTP Version = "http" "/" 1*DIGIT "." 1*DIGIT
Заметьте, что числа major и minor должны рассматриваться как независимые целые, так что каждое из них может быть увеличено за пределы одной цифры. Таким образом, HTTP/2.4 является более низкой версией, чем HTTP/2.13, которая, в свою очередь, ниже, чем HTTP/12.3. Начальные нули должны игнорироваться и не пересылаться.
Приложения, посылающие запросы или отклики так, как это определено в спецификации, должны включать HTTP-Version "HTTP/1.1". Использование этого номера версии указывает, что посылающее приложение совместимо с этой спецификацией.
Версия HTTP приложения является верхней, совместимость с которой гарантируется. Приложения проксисерверов и сетевых портов должны проявлять осторожность при переадресации сообщений с протокольной версией, отличной от поддерживаемой ими. Так как версия протокола указывает на возможности отправителя, прокси никогда не должны пересылать сообщения с версией больше, чем их собственная; если получено сообщение более высокой версии, прокси/порт должен либо понизить версию запроса, либо послать отклик об ошибке или переключиться в режим туннеля. Запросы с версией ниже, чем у прокси/порта, могут быть повышены при переадресации, при этом major часть версии сервера и запроса должны совпадать.
Преобразование между версиями может включать модификацию полей заголовка.
Универсальные идентификаторы ресурсов (URI)
URI известен под многими именами: WWW адрес, универсальный идентификатор документа (Universal Document Identifier), универсальный идентификатор ресурса (Universal Resource Identifier) и, наконец, универсальный локатор ресурса URL (Uniform Resource Locator) и универсальное имя ресурса (URN). Тождество URI и URL сомнительно, так как URL является частным случаем URI. Что касается HTTP, универсальный идентификатор ресурса представляет собой форматированную строку символов, которая идентифицирует имя, положение или какие-то еще характеристики ресурса.
Общий синтаксис
URI в HTTP может быть представлен в абсолютной или относительной форме по отношению к некоторому известному базовому URI, в зависимости от контекста его использования. Эти две формы отличаются тем, что абсолютный URI всегда начинается с имени схемы, за которым следует двоеточие (например, HTTP: или FTP:).
URI = ( absoluteURI | relativeURI ) [ "#" фрагмент ]
AbsoluteURI = схема ":" *( uchar | reserved )
RelativeURI = net_path | abs_path | rel_path
net_path = "//" net_loc [ abs_path ]
abs_path = "/" rel_path
rel_path = [ проход ] [ ";" params ] [ "?" query ]
path = fsegment *( "/" сегмент )
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,
зарезервированный, extra, safe и unsafe>
Более детальную информацию о синтаксисе и семантике URL можно найти в RFC-1738 [7.4] и [7.11]. Приведенные выше BNF включают в себя национальные символы, недопустимые в URL, как это специфицировано в RFC- 1738, так как серверам HTTP не запрещено использование любых наборов символов, допустимых в rel_path частях адресов; HTTPпрокси могут получить запросы URI, не определенные в рамках RFC-1738.
Протокол HTTP не устанавливает каких-либо ограничений на длину URI. Серверы должны быть способны обрабатывать URI любых ресурсов, имеющих любую длину. Сервер должен выдать отклик 414 (Request-URI Too Long — URI запроса слишком длинен), если URI длиннее, чем может обработать сервер.
Серверы должны избегать использования URI длиннее 255 байт, так как некоторые старые клиенты или проксиприложения не могут корректно работать с такими длинами.
HTTP URL
Схема HTTP используется для локализации сетевых ресурсов с помощью протокола HTTP. Далее определены синтаксис и семантика HTTP URL, зависящие от схемы.
http_URL = "http:" "//" host [ ":" port ] [ abs_path ]
Host = <Легальное имя ЭВМ в Интернет или IP-адрес (в точечноцифровой форме),
как это определено в разделе 2.1 RFC-1123>
Port = *DIGIT
Если номер порта не указан, предполагается порт 80. Семантика устроена так, что идентифицированный ресурс размещается на сервере, который ожидает TCP-соединения через порт данной ЭВМ, а Request-URI для ресурса находится в abs_path. Использование IP адресов в URL следует избегать всюду, где это возможно (см. RFC-1900 [7.24]). Если abs_path в URL отсутствует, он должен считаться равным "/", в случае, если он используется в качестве Request-URI для ресурса.
Сравнение URI
При сравнении двух URI с целью проверки их идентичности клиент должен использовать пооктетное сравнение с учетом регистра, в котором напечатаны символы. Допускаются следующие исключения:
номер порта не указан, тогда для данного URI берется значение по умолчанию;
сравнение имен ЭВМ и схем не должно быть чувствительным к строчным/прописным буквам;
Пустой abs_path эквивалентен abs_path "/".
Символы, отличные от типов reserved и unsafe, устанавливаются равными их эквивалентам в кодировке ""%" HEX HEX". Например, следующие три записи URI являются эквивалентными:
http://abc.com:80/~smith/home.html
http://ABC.com/%7Esmith/home.html
http://ABC.com:/%7Esmith/home.html