- PVSM.RU - https://www.pvsm.ru -
Привет, Хабровчане! Рыская по интернетам, зашел на страницу про URI и спустя несколько часов осознал, как мало я знал об этом монстре. Признаюсь, до этого я думал, что URI это либо URL, либо URN, и мои познания ограничивались этой схемой:
Каково же было мое удивление, что в этой теме еще очень много нового. Начнем по порядку.
URI [1] (Uniform Resource Identifier) - унифицированный идентификатор ресурса. В кратце, он позволяет идентифицировать какой-либо ресурс: физический (https://assets.habr.com/habr-web/img/favicons/favicon-16.png - файл на сервере) или абстрактный (https://vk.com/settings - его не существует).
Сам по себе URI ничего нам не дает, это всего лишь "интерфейс" (выражаясь на ООП). Самое интересное нам дают его подтипы.
Его "интерфейс":
URI = [ схема ":" ] иерархическая-часть [ "?" запрос ] [ "#" фрагмент ]
URN [2] (Uniform Resource Name) - единообразное название ресурса. Может по одному только названию дать вам ресурс (также абстрактный или физический).
<URN> ::= "urn:" <NID> ":" <NSS>
<NID> - namespace identifier - идентификатор пространства.
<NSS> - namespace specific string - название ресурса в этом пространстве
Пример: urn:isbn:540609601X - идентификатор конкретной книги, так как ISBN - уникальный
URL [3] (Uniform Resource Locator) - унифицированный локатор ресурса. Говорит, где нам нужно найти ресурс. Наверное, в представлении не нуждается. Все мы используем его повседневно.
Теперь мы переходим к самым глубинам...
PURL [4] (Persistent Uniform Resource Locator) - постоянный единообразный определитель ресурса.
Вспомним, что URL - говорит нам "куда идти, чтобы получить ресурс", но что делать если его: удалили, переместили, переименовали и т.д. Одним из решений может стать использование URN, но до этого пока далеко. Здесь нам на помощь и приходит PURL.
Его основная идея заключается в том, чтобы создать базу данных адресов PURL, которая будет отображать PURL на активный URL и перенаправлять на этот URL (Http Redirect, например).
<PURL> ::= <SCHEME> "://" <HOST> "/" <URL>
Как видно структура не особо отличается от старого доброго URL. Отличия в том, что HOST - сервер базы данных PURL, а URL - адрес ресурса, к которому хотим получить доступ.
Пример
Зарегистрированный адрес PURL
http://purl.russian-books.com/WarAndPeace/
Отображается на
http://your.web.server/your/web/root/
В результате, пришедший на адрес запрос
http://purl.russian-books.com/WarAndPeace/chapter12.html
Перенаправится на
http://your.web.server/your/web/root/chapter12.html
IRI [5] (Internationalized Resource Identifier) - интернационализированный идентификатор ресурса. Позволяет записать адрес ресурса на любом языке мира.
Замечили ли вы, что русские буквы, пробелы и многие другие символы в URL кодируются странными символами на подобие: %D0%B7%D0%B0%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BE.
Это все из-за ограничений URL. Допустимые символы (RFC 3986 [6]):
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
Чтобы обойти это ограничение создали IRI. В таком типе адресов используется Unicode вместо US-ASCII.
Таким образом, адрес
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82
Превращается в
https://ru.wikipedia.org/wiki/Программист
XRI [7] (Extensible Resource Identifier) - расширяемый идентификатор ресурса. Этот протокол создается OASIS [8]. Этот протокол иммет глобальные цели, не умещающиеся в рамках 1 поста. Потому опишу его вкратце
XRI не только совместим с IRI и URI, но также является возможной заменой всей системы DNS и IP адресации! В протоколе фигурируют 2 слоя идентификаторов:
I-Number - постоянный адрес (этим схож с IP). Регистрируется на определенный ресурс и больше никогда не перерегистрируются (в отличие от разных IP для одного и того же сервера)
I-Name - удобочитаемый для человека адрес (этим схож с DNS). I-Name разрешается в I-Number.
В отличие от DNS адресация:
Неиерархическая одноранговая
Может иметь взаимные ссылки (cross-references) - один XRI вложен в другой и один логический ресурс может идентифицироваться в различных контекстах
Имеет глобальные реестры контекстов
= - частные лица
@ - организации
+ - общие понятия
Примеры
I-Names:
=Ivan.Petrov
@Yandex/(+programmer.id)
+phone.number
I-Numbers:
!!43534!A8C3/!D90F.88
!!1002!A7C5
Технический комитет по разработке был закрыт 8.07.2015, а сам протокол больше не находится в разработке.
Вы наверное знаете, что существуют доменные имена на кириллице. Например, https://стопкоронавирус.рф [9].
Загвоздка в том, что для хранения доменного имени могут использоваться только цифры, символы латинского алфавита и "-" (всего 37 символов). Но как тогда используются домены .рф? Они используют другую систему DNS? Нет. Здесь используется алгоритм кодирования Punycode [10]. Этот алгоритм преобразовывает Unicode последовательность в ACE последовательность, которую понимают DNS.
Алгоритм состоит из 2 шагов:
Перенести все исходные ASCII символы в результирующую строку (их не трогать)
Если есть не ASCII символы, то
Добавить в конец "-"
Последовательно кодировать все оставшиеся символы
Алгоритм описан в RFC 3492 [11] и также на Википедии [12]
Надеюсь вы узнали для себя, что-то новое и статья оказалась полезной. Как минимум теперь вы не будете утверждать, что "У URI есть только 2 союзника - URL и URN".
Автор:
AshBlade
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/internet/375353
Ссылки в тексте:
[1] URI: https://ru.wikipedia.org/wiki/URI
[2] URN: https://ru.wikipedia.org/wiki/URN
[3] URL: https://ru.wikipedia.org/wiki/URL
[4] PURL: https://ru.wikipedia.org/wiki/PURL
[5] IRI: https://ru.wikipedia.org/wiki/Internationalized_Resource_Identifier
[6] RFC 3986: https://datatracker.ietf.org/doc/html/rfc3986/#section-2
[7] XRI: https://ru.wikipedia.org/wiki/XRI
[8] OASIS: https://ru.wikipedia.org/wiki/OASIS
[9] https://стопкоронавирус.рф: https://xn--80aesfpebagmfblc0a.xn--p1ai/
[10] Punycode: https://ru.wikipedia.org/wiki/Punycode
[11] RFC 3492: https://datatracker.ietf.org/doc/html/rfc3492
[12] Википедии: https://en.wikipedia.org/wiki/Punycode#Encoding_procedure
[13] Источник: https://habr.com/ru/post/667120/?utm_source=habrahabr&utm_medium=rss&utm_campaign=667120
Нажмите здесь для печати.