🔗 URI, URL, URN

Чем отличаются URI, URL и URN, из чего состоит адрес, кодирование и относительные пути.

Теория · Администрирование · #uri #url #urn #web

Соотношение

URI (Uniform Resource Identifier) общее понятие идентификатора ресурса. Два вида:

  • URL (Locator) говорит, где ресурс находится и как его получить: https://example.com/page.
  • URN (Name) говорит, как ресурс называется, независимо от места: urn:isbn:9785171234567.

Каждый URL и URN является URI.

Устройство URL

https://anna:pw@example.com:8443/path/to/page.html?q=cats&page=2#section
└─┬─┘   └──┬───┘ └───┬─────┘└─┬─┘└──────┬───────┘ └────┬─────┘ └──┬──┘
схема   userinfo    хост    порт       путь          запрос    фрагмент
Часть Пример Примечание
Схема https, http, ftp, mailto, file, ssh протокол или тип
Userinfo anna:pw@ устарело и небезопасно
Хост example.com, 192.168.1.5, [::1] домен или IP
Порт 8443 по умолчанию: http 80, https 443
Путь /path/to/page.html расположение на сервере
Запрос ?q=cats&page=2 параметры ключ=значение, разделитель &
Фрагмент #section якорь в документе, на сервер не отправляется

Примеры URN

urn:isbn:0451450523
urn:ietf:rfc:2648
urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66

Кодирование (percent-encoding)

Недопустимые символы заменяются на %XX: пробел %20 (в запросе иногда +), / %2F, ? %3F, # %23, & %26, кириллица в UTF-8 (%D0%9F…).

encodeURIComponent("кошки & собаки");   // %D0%BA...%20%26%20...
new URL("https://x.com/a?b=1").searchParams.get("b");   // "1"

Зарезервированные символы: : / ? # [ ] @ ! $ & ' ( ) * + , ; =.

Относительные и абсолютные адреса

Базовый адрес https://x.com/docs/guide/index.html:

Ссылка Результат
page.html https://x.com/docs/guide/page.html
../api/ https://x.com/docs/api/
/about https://x.com/about
//cdn.com/f.js https://cdn.com/f.js (та же схема)
#top якорь на той же странице

Практика

  • Хостпорт и схема в нижнем регистре равнозначны, путь и запрос чувствительны к регистру.
  • Не размещайте секреты (пароли, токены) в URL: они попадают в логи и историю.
  • Канонические адреса помогают SEO: избегайте дублей со слэшем и без.
  • Разбор в коде: URL (JS), urllib.parse (Python), java.net.URI.