🔗 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.