Beyond URL and URN
Привет, Хабровчане! Рыская по интернетам, зашел на страницу про URI и спустя несколько часов осознал, как мало я знал об этом монстре. Признаюсь, до этого я думал, что URI это либо URL, либо URN, и мои познания ограничивались этой схемой:
Источник: https://danielmiessler.com/study/difference-between-uri-url/
Каково же было мое удивление, что в этой теме еще очень много нового. Начнем по порядку.
URI
URI (Uniform Resource Identifier) — унифицированный идентификатор ресурса. В кратце, он позволяет идентифицировать какой-либо ресурс: физический (https://assets.habr.com/habr-web/img/favicons/favicon-16.png — файл на сервере) или абстрактный (https://vk.com/settings — его не существует).
Сам по себе URI ничего нам не дает, это всего лишь «интерфейс» (выражаясь на ООП). Самое интересное нам дают его подтипы.
Его «интерфейс»:
URI = [ схема ":" ] иерархическая-часть [ "?" запрос ] [ "#" фрагмент ]
URN
URN (Uniform Resource Name) — единообразное название ресурса. Может по одному только названию дать вам ресурс (также абстрактный или физический).
::= "urn:" ":"
Пример: urn: isbn:540609601X — идентификатор конкретной книги, так как ISBN — уникальный
URL
URL (Uniform Resource Locator) — унифицированный локатор ресурса. Говорит, где нам нужно найти ресурс. Наверное, в представлении не нуждается. Все мы используем его повседневно.
Теперь мы переходим к самым глубинам…
PURL
PURL (Persistent Uniform Resource Locator) — постоянный единообразный определитель ресурса.
Вспомним, что URL — говорит нам «куда идти, чтобы получить ресурс», но что делать если его: удалили, переместили, переименовали и т.д. Одним из решений может стать использование URN, но до этого пока далеко. Здесь нам на помощь и приходит PURL.
Его основная идея заключается в том, чтобы создать базу данных адресов PURL, которая будет отображать PURL на активный URL и перенаправлять на этот URL (Http Redirect, например).
::= "://" "/"
Как видно структура не особо отличается от старого доброго 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
IRI (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):
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
XRI (Extensible Resource Identifier) — расширяемый идентификатор ресурса. Этот протокол создается OASIS. Этот протокол иммет глобальные цели, не умещающиеся в рамках 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://стопкоронавирус.рф.
Загвоздка в том, что для хранения доменного имени могут использоваться только цифры, символы латинского алфавита и »-» (всего 37 символов). Но как тогда используются домены .рф? Они используют другую систему DNS? Нет. Здесь используется алгоритм кодирования Punycode. Этот алгоритм преобразовывает Unicode последовательность в ACE последовательность, которую понимают DNS.
Алгоритм состоит из 2 шагов:
Перенести все исходные ASCII символы в результирующую строку (их не трогать)
Если есть не ASCII символы, то
Алгоритм описан в RFC 3492 и также на Википедии
Итог
Надеюсь вы узнали для себя, что-то новое и статья оказалась полезной. Как минимум теперь вы не будете утверждать, что «У URI есть только 2 союзника — URL и URN».