Изменяемая абсолютная или относительная URI-ссылка с символами Unicode на основе RFC 3986 и RFC 3987. Все изменения атомарны: при ошибке объект сохраняет прежнее состояние. Компоненты, которых операция не касается, сохраняют исходное написание.
Имя класса URL используется как короткое предметное имя. Объект представляет URI-ссылку: она может быть
абсолютной или относительной.
- Основные понятия
- Создание
- Общие свойства и представление
- Схема URL
- Серверная часть URL
- Данные пользователя URL
- Хост URL
- Порт URL
- Путь URL
- Строка запроса URL
- Фрагмент URL
- Разрешение ссылок
- Нормализация и сравнение
- Примеры
- Связанные сущности
Пример иерархической URI-ссылки с серверной частью:
схема://данные-пользователя@хост:порт/путь?запрос#фрагмент
Серверная часть содержит только данные пользователя, хост и порт. Путь, запрос и фрагмент в неё не входят.
Абсолютная URI-ссылка содержит схему, например urn:isbn:9780140328721 или http:/path. Относительная ссылка
схемы не содержит, например ../images/logo.svg. Дополнительные требования http, https, ws, wss и ftp
проверяет отдельный метод СоответствуетСхеме().
Для компонентов с процентным кодированием предусмотрены пары методов:
- метод со словом
Кодированныйвозвращает или принимает исходное%HH; - метод без слова
Кодированныйдекодирует или кодирует значение как UTF-8.
Например, для пути /files/a%2Fb метод КодированныйПуть() вернёт /files/a%2Fb, а Путь() вернёт
/files/a/b. При этом %2F остаётся частью одного сегмента и не становится разделителем.
Если границы сегментов имеют значение для маршрутизации или проверки безопасности, используйте
СегментыПути() или КодированныеСегментыПути(). Не разделяйте результат Путь() по символу /: после
декодирования нельзя отличить исходный разделитель от %2F внутри сегмента.
УстановитьПуть("/a%2Fb") считает % данными и создаёт /a%252Fb.
УстановитьКодированныйПуть("/a%2Fb") сохраняет /a%2Fb.
Серверная часть и её компоненты, запрос и фрагмент могут отсутствовать. При отсутствии метод возвращает
Неопределено, при наличии пустого компонента возвращает пустую строку.
| Строка | Метод | Результат |
|---|---|---|
//host/path |
ТекстПорта() |
Неопределено |
//host:/path |
ТекстПорта() |
"" |
/path |
КодированныйХост() |
Неопределено |
///path |
КодированныйХост() |
"" |
/path |
КодированнаяСтрокаЗапроса() |
Неопределено |
/path? |
КодированнаяСтрокаЗапроса() |
"" |
/path |
КодированныйФрагмент() |
Неопределено |
/path# |
КодированныйФрагмент() |
"" |
Конструктор и методы изменения проверяют общую грамматику URI, но не ограничения конкретной схемы. Например,
http:/path синтаксически корректен, однако СоответствуетСхеме() вернёт Ложь, потому что у http нет хоста.
Конструктор проверяет форму процентных последовательностей в пути, данных пользователя, хосте и фрагменте.
В строке запроса допускается литеральный %. Подробнее это поведение описано в
ПараметрыЗапросаURL. Декодирование UTF-8 выполняется при вызове декодирующих
методов, поэтому они могут вызвать encoding.invalid.
Новый URL(<Адрес> = Неопределено, <База> = Неопределено)Полная диспетчеризация конструктора:
Адрес |
База |
Поведение |
|---|---|---|
Неопределено |
Неопределено |
Создание пустой относительной ссылки |
Строка или URL |
Неопределено |
Создание независимого абсолютного или относительного URL |
Строка или URL |
Абсолютная база | Разрешение по RFC 3986 § 5.2 |
Неопределено |
Заданная база | argument.required |
| Любая ссылка | Относительная база | url.base_not_absolute |
Параметры:
| Имя | Тип | Описание |
|---|---|---|
| Адрес | Строка, URL, Неопределено |
Создаваемая ссылка |
| База | Строка, URL, Неопределено |
Абсолютная база для относительной ссылки |
Конструктор возвращает новый URL либо вызывает исключение:
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип адреса или базы |
argument.required |
База задана без адреса |
url.base_not_absolute |
База не является абсолютной |
| Коды разбора URI | Адрес или база имеют недопустимый синтаксис |
#Использовать url
Адрес = Новый URL("../users", "https://example.com/api/");
// https://example.com/usersВозвращает текущее представление URL. Сразу после разбора оно совпадает с исходным написанием. После изменения затронутый компонент может быть сериализован заново, а остальные компоненты сохраняют своё написание.
.ВСтроку()Строка: текущее представление URL.
Возвращает ASCII-представление URL. Символы Unicode, включая символы хоста, преобразуются в UTF-8, после чего
каждый полученный байт записывается как %HH. Уже записанные последовательности %HH сохраняют регистр
шестнадцатеричных цифр.
.КодированноеПредставление()Строка: URL, состоящий из символов ASCII.
Создаёт полностью независимую изменяемую копию.
.Скопировать()Новый URL с независимым состоянием.
Проверяет только наличие схемы. Например, http:/path является абсолютным URI, хотя не соответствует схеме http.
.ЯвляетсяАбсолютным()Булево: Истина, если ссылка содержит схему.
Возвращает Булево по результату проверки дополнительных ограничений схем http, https,
ws, wss и ftp. Для относительной ссылки или неизвестной схемы возвращает Истина. Известные схемы требуют
непустой хост; указанный непустой порт должен входить в диапазон 0..65535. ws и wss запрещают данные
пользователя и фрагмент. Вызывайте метод после создания или изменения URL, если нужны ограничения схемы.
.СоответствуетСхеме()Успешный конструктор, РазборURL.ПопытатьсяРазобрать() и РазборURL.ЭтоКорректнаяСсылка() не заменяют эту
проверку. Метод проверяет структуру известной схемы, но не определяет доверие к узлу и не заменяет
ограничения приложения на сетевые адреса.
Булево: Истина, если ссылка соответствует ограничениям своей схемы.
Возвращает схему без завершающего :.
.Схема()Строка или Неопределено, если ссылка относительная и не содержит схемы.
Устанавливает схему абсолютного URL без завершающего :.
.УстановитьСхему(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка |
Новая схема |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_scheme |
Значение не соответствует грамматике схемы |
Возвращает кодированные данные пользователя, хост и порт без начального //. Путь, запрос и фрагмент не входят.
.КодированнаяСервернаяЧасть()Строка или Неопределено, если серверная часть отсутствует.
Возвращает декодированные данные пользователя, хост и порт без начального //. Путь, запрос и фрагмент не входят.
.СервернаяЧасть()Строка или Неопределено, если серверная часть отсутствует.
| Код | Условие |
|---|---|
encoding.invalid |
Один из декодируемых компонентов содержит некорректный UTF-8 |
idna.data.invalid |
Встроенные данные IDNA повреждены или несовместимы |
Устанавливает кодированную серверную часть без изменения исходного написания.
.УстановитьКодированнуюСервернуюЧасть(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка, Неопределено |
Кодированная серверная часть либо признак её удаления |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
| Коды разбора URI | Нарушены синтаксис, форма %HH, форма хоста или IP-литерала |
Неопределено удаляет серверную часть вместе с её подкомпонентами.
Разбирает и устанавливает декодированную серверную часть. Символы @, :, [ и ] интерпретируются как
структурные разделители.
.УстановитьСервернуюЧасть(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка, Неопределено |
Серверная часть либо признак её удаления |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит недопустимую кодовую точку Unicode |
url.invalid_authority |
Нарушена структура серверной части |
url.invalid_host |
Некорректен хост |
Неопределено удаляет серверную часть вместе с данными пользователя, хостом и портом.
Возвращает строго декодированные данные пользователя без завершающего @.
.ДанныеПользователя()Строка или Неопределено, если данные пользователя отсутствуют.
| Код | Условие |
|---|---|
encoding.invalid |
Процентные байты не образуют корректную последовательность UTF-8 |
Возвращает кодированные данные пользователя без завершающего @.
.КодированныеДанныеПользователя()Строка или Неопределено, если данные пользователя отсутствуют.
Возвращает строку URL без кодированных данных пользователя и разделителя @.
.ВСтрокуБезДанныхПользователя()Строка: URL без имени пользователя и пароля. Остальные компоненты сохраняются без изменений.
Метод не гарантирует безопасное журналирование: секреты могут оставаться в пути, запросе и фрагменте.
Возвращает строку URL, в которой текст после первого буквального : в данных пользователя заменён на *****.
Если буквального : нет, строка возвращается без изменений. Кодированный %3A разделителем не считается.
.ВСтрокуСМаскированнымПаролем()Строка: URL с замаскированным паролем. Имя пользователя и остальные компоненты сохраняются без изменений.
Метод не гарантирует безопасное журналирование: секреты могут оставаться в пути, запросе и фрагменте.
Кодирует и устанавливает полные данные пользователя.
.УстановитьДанныеПользователя(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка, Неопределено |
Данные пользователя либо признак их удаления |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит недопустимую кодовую точку Unicode |
При отсутствии серверной части она создаётся с пустым хостом. Неопределено удаляет имя и пароль.
Устанавливает кодированные данные пользователя без завершающего @ и без изменения исходного написания.
.УстановитьКодированныеДанныеПользователя(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка, Неопределено |
Кодированные данные либо признак их удаления |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит символы вне ASCII |
url.invalid_authority |
Значение нарушает структуру данных пользователя |
url.invalid_percent_encoding |
Нарушена форма %HH |
При отсутствии серверной части она создаётся с пустым хостом. Неопределено удаляет имя и пароль.
Хост() возвращает декодированное имя, КодированныйХост() сохраняет процентное кодирование, а IDNХост()
преобразует международное доменное имя в Punycode для DNS. КодированноеПредставление() кодирует весь URI в
ASCII, но не заменяет доменное имя на Punycode.
Чтобы получить полностью кодированную строку с DNS-совместимым хостом, создайте копию, установите в неё результат
IDNХост() и вызовите КодированноеПредставление():
#Использовать url
Адрес = Новый URL("https://пример.рф/путь");
СетевойАдрес = Адрес.Скопировать();
СетевойАдрес.УстановитьХост(Адрес.IDNХост());
Сообщить(СетевойАдрес.КодированноеПредставление());
// https://xn--e1afmkfd.xn--p1ai/%D0%BF%D1%83%D1%82%D1%8CИспользуйте исходное, процентно-кодированное или Punycode-представление в соответствии с требованиями клиента, которому передаётся адрес.
Возвращает вид хоста: зарегистрированное имя, IPv4, IPv6 или IPvFuture. Значения перечислены в
ВидыХостаURL. Без серверной части возвращает Неопределено.
.ВидХоста()Строка из модуля ВидыХостаURL или Неопределено без серверной части.
Возвращает явно заданный IPv4- или IPv6-адрес хоста по RFC 3986 §3.2.2. Квадратные скобки IPv6-литерала URL в результат не входят.
IP = Адрес.IPАдресХоста();IPАдрес для IPv4- или IPv6-хоста.
Для зарегистрированного имени,
IPvFuture, пустого или отсутствующего хоста возвращает Неопределено.
Метод не выполняет разрешение доменного имени и не является самостоятельной защитой от SSRF. Зарегистрированное имя, включая похожие на IP-адрес нестандартные формы, может быть интерпретировано сетевым стеком как IP-адрес, о чём предупреждает RFC 3986 §7.4. Проверять нужно фактически разрешённые адреса.
Проверяет, указывает ли явно заданный хост URL на сетевой интерфейс обратной петли (loopback). Проверка выполняется без DNS-запросов и обращения к файлу hosts.
.ЯвляетсяПетлевым()Метод возвращает Истина для:
- IPv4-адресов из
127.0.0.0/8по RFC 1122 §3.2.1.3; - IPv6-адреса
::1по RFC 4291 §2.5.3; localhost,localhost.и имён внутри.localhostбез учёта регистра по RFC 6761 §6.3.
При распознавании дерева localhost процентное кодирование незарезервированных символов не меняет
результат. Например, local%68ost распознаётся как localhost по правилам
RFC 3986 §6.2.2.2.
IPv6-адрес с отображённым IPv4 по
RFC 4291 §2.5.5.2
классифицируется по вложенному IPv4-адресу. Например, ::ffff:127.0.0.1 считается петлевым,
а ::ffff:192.0.2.1 нет.
Булево: Истина, если хост является петлевым.
| Код | Условие |
|---|---|
encoding.invalid |
Процентные байты имени не образуют корректную последовательность UTF-8 |
idna.data.invalid |
Встроенные данные IDNA повреждены или несовместимы |
Метод классифицирует только текст URL и не является защитой от SSRF. Другое доменное имя может разрешиться в петлевой или иной специальный IP-адрес, а результат DNS может измениться между проверкой и подключением.
Возвращает кодированный хост без преобразования в Punycode. Квадратные скобки IP-литерала сохраняются.
.КодированныйХост()Строка или Неопределено, если серверная часть отсутствует.
Устанавливает кодированный хост без изменения исходного написания. IPv6 и IPvFuture должны быть заключены в квадратные скобки.
.УстановитьКодированныйХост(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка |
Кодированный хост |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит символы вне ASCII |
url.invalid_percent_encoding |
Нарушена форма %HH |
url.invalid_host |
Хост не распознан |
Устанавливает декодированный хост. IPv6-адрес без скобок автоматически заключается в квадратные скобки.
В ВСтроку() символы Unicode сохраняются, а в КодированноеПредставление() и КодированныйХост() каждый байт
их представления в UTF-8 записывается как %HH.
.УстановитьХост(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка |
Зарегистрированное имя, IPv4, IPv6 или IPvFuture |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит недопустимую кодовую точку Unicode |
url.invalid_host |
Хост синтаксически недопустим |
Возвращает декодированное логическое представление хоста.
.Хост()Строка или Неопределено, если серверная часть отсутствует.
| Код | Условие |
|---|---|
encoding.invalid |
Процентные байты имени не образуют корректную последовательность UTF-8 |
idna.data.invalid |
Встроенные данные IDNA повреждены или несовместимы |
Возвращает ASCII-совместимое представление хоста. Международное доменное имя строго
проверяется по UTS #46 и преобразуется в Punycode с непереходной
обработкой. ASCII-метки проверяются по правилам CheckHyphens и UseSTD3ASCIIRules: разрешены только буквы,
цифры и дефис, дефис запрещён в начале и конце, а последовательность -- в позициях 3 и 4
разрешена только в префиксе xn--.
Метка не может превышать 63 октета, а полное ASCII-имя без завершающей точки - 253 октета. IP-адрес
возвращается без изменений.
Метка означает часть доменного имени между точками, а октет в этом разделе означает один байт ASCII.
Непереходная обработка не заменяет специальные символы устаревшими ASCII-аналогами, например ß не превращается
в ss. CheckHyphens проверяет положение дефисов, а UseSTD3ASCIIRules запрещает в ASCII-метках символы, кроме
букв, цифр и дефиса.
.IDNХост()Строка или Неопределено, если хост отсутствует.
| Код | Условие |
|---|---|
encoding.invalid |
Процентные байты имени не образуют корректную последовательность UTF-8 |
url.invalid_host |
Зарегистрированное имя не соответствует требованиям IDNA |
idna.data.invalid |
Встроенные данные IDNA повреждены или несовместимы |
Проверяет, отсутствует ли порт, пуст ли он или равен стандартному порту схемы.
.ИспользуетСтандартныйПорт()Булево: Истина, если URL использует стандартный порт известной схемы.
Возвращает числовое значение явно указанного непустого порта. Стандартный порт схемы не подставляется.
.Порт()Число или Неопределено для отсутствующего либо пустого порта.
| Код | Условие |
|---|---|
url.port.numeric_overflow |
Текст порта нельзя точно представить числом |
Возвращает стандартный порт известной схемы.
.СтандартныйПорт()Число или Неопределено, если схема неизвестна.
Возвращает исходный текст порта без начального :.
.ТекстПорта()Строка или Неопределено, если разделитель порта отсутствует. Для пустого порта возвращается пустая строка.
Устанавливает порт; допускаются значения больше 65535.
.УстановитьПорт(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка, Число, Неопределено |
Порт либо признак его удаления |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
argument.invalid_value |
Передано отрицательное или дробное число либо строка, содержащая не только цифры ASCII |
Пустая строка создаёт определённый пустой порт. Неопределено удаляет порт. При необходимости серверная часть
создаётся автоматически.
Возвращает явно указанный непустой порт либо стандартный порт схемы.
.ЭффективныйПорт()Число или Неопределено, если схема неизвестна и явный непустой порт отсутствует.
| Код | Условие |
|---|---|
url.port.numeric_overflow |
Явный порт нельзя точно представить числом |
Кодирует значение как один сегмент и добавляет его в конец пути. Символ / внутри значения кодируется как %2F.
Если путь уже заканчивается /, новый непустой сегмент записывается после этого разделителя без добавления второго
/. Добавление пустого сегмента к непустому пути, оканчивающемуся /, добавляет ещё один /.
| Исходный URL | Сегмент | Результат |
|---|---|---|
https://host/a |
b/c.txt |
https://host/a/b%2Fc.txt |
https://host/a/ |
b |
https://host/a/b |
https://host/a/ |
"" |
https://host/a// |
| Относительная пустая ссылка | "" |
Пустая ссылка |
.ДобавитьСегментПути(<Сегмент>)| Параметр | Тип | Описание |
|---|---|---|
| Сегмент | Строка |
Декодированный сегмент пути |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Сегмент содержит недопустимую кодовую точку Unicode |
Последовательно кодирует и добавляет несколько сегментов пути.
.ДобавитьСегментыПути(<Сегменты>)| Параметр | Тип | Описание |
|---|---|---|
| Сегменты | Массив, ФиксированныйМассив |
Декодированные строковые сегменты |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передано значение другого типа либо коллекция содержит нестроковый элемент |
url.invalid_syntax |
Один из сегментов содержит недопустимую кодовую точку Unicode |
Перед изменением проверяются все элементы, поэтому ошибка не приводит к частичному добавлению.
Если первый сегмент относительной ссылки без серверной части содержит :, перед путём добавляется ./ по
RFC 3986 § 4.2.
Разделяет путь по буквальному / до декодирования.
.КодированныеСегментыПути()Новый ФиксированныйМассив кодированных сегментов пути.
Пустые сегменты сохраняются по тем же правилам, что и в СегментыПути().
Возвращает кодированный путь.
.КодированныйПуть()Строка: кодированный путь, включая пустую строку.
Возвращает путь после строгого декодирования UTF-8.
.Путь()Строка: декодированный путь.
| Код | Условие |
|---|---|
encoding.invalid |
Процентные байты не образуют корректную последовательность UTF-8 |
Возвращает путь и запрос в кодированном виде без фрагмента.
.ПутьИСтрокаЗапроса()Строка: кодированный путь и, при наличии ?, кодированный запрос с разделителем.
Разделяет путь по буквальному / и строго декодирует каждый сегмент как UTF-8.
.СегментыПути()Новый ФиксированныйМассив декодированных сегментов пути.
Пустые сегменты сохраняются. Пустой путь даёт один элемент "", путь / даёт два элемента "", а
завершающий / создаёт завершающий пустой элемент. Например, /a/ даёт "", "a", "".
| Код | Условие |
|---|---|
encoding.invalid |
Один из сегментов содержит некорректный UTF-8 |
Устанавливает кодированный путь без изменения исходного написания.
.УстановитьКодированныйПуть(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка |
Кодированный путь |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит недопустимый символ |
url.invalid_percent_encoding |
Нарушена форма %HH |
Кодирует и устанавливает полный путь, сохраняя структурные разделители /.
.УстановитьПуть(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка |
Декодированный путь |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит недопустимую кодовую точку Unicode |
СтрокаЗапроса() работает со всем запросом как с компонентом URI и оставляет + без изменений.
ПараметрыЗапроса() по умолчанию разбирает пары в формате
RFC3986(), где + является обычным символом. Для интерпретации
application/x-www-form-urlencoded вызовите РазобратьКак(ФорматыПараметровЗапросаURL.ВебФорма()).
Повторные вызовы ПараметрыЗапроса() возвращают одну и ту же коллекцию. Ранее полученная ссылка на неё остаётся
актуальной после изменения строки запроса через методы URL. Чтение параметров сохраняет исходное написание,
а изменение пар влияет на последующее представление URL в соответствии с текущим форматом.
Возвращает строку запроса после строгого декодирования UTF-8.
.СтрокаЗапроса()Строка или Неопределено, если строка запроса отсутствует.
| Код | Условие |
|---|---|
encoding.invalid |
Процентные байты не образуют корректную последовательность UTF-8 |
Возвращает кодированную строку запроса без начального ?.
.КодированнаяСтрокаЗапроса()Строка или Неопределено, если строка запроса отсутствует. Пустая строка запроса возвращается пустой строкой.
Возвращает связанную с URL коллекцию параметров запроса.
.ПараметрыЗапроса()Тот же объект ПараметрыЗапросаURL на протяжении жизни URL.
Кодирует и устанавливает строку запроса без начального ?.
.УстановитьСтрокуЗапроса(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка, Неопределено |
Декодированная строка запроса либо признак её удаления |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит недопустимую кодовую точку Unicode |
Пустая строка создаёт определённый пустой запрос ?. Неопределено полностью удаляет запрос.
Устанавливает кодированную строку запроса без начального ? и без изменения исходного написания.
.УстановитьКодированнуюСтрокуЗапроса(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка, Неопределено |
Кодированная строка запроса либо признак её удаления |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит недопустимый символ |
Пустая строка создаёт определённый пустой запрос ?. Неопределено полностью удаляет запрос. Процент, не
образующий последовательность %HH, в кодированном представлении заменяется на %25.
Копирует пары и текущий формат. Если в пустой коллекции строка запроса отсутствует, компонент запроса удаляется. Переданная коллекция остаётся независимой, а ранее полученная ссылка на параметры целевого URL остаётся актуальной.
.УстановитьПараметрыЗапроса(<Значение>)| Имя | Тип | Описание |
|---|---|---|
| Значение | ПараметрыЗапросаURL |
Копируемая коллекция |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передано значение другого типа |
Возвращает кодированный фрагмент без начального #.
.КодированныйФрагмент()Строка или Неопределено, если фрагмент отсутствует. Пустой фрагмент возвращается пустой строкой.
Устанавливает кодированный фрагмент без начального # и без изменения исходного написания.
.УстановитьКодированныйФрагмент(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка, Неопределено |
Кодированный фрагмент либо признак его удаления |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит недопустимый символ |
url.invalid_percent_encoding |
Нарушена форма %HH |
Пустая строка создаёт определённый пустой фрагмент #. Неопределено полностью удаляет фрагмент.
Кодирует и устанавливает фрагмент без начального #.
.УстановитьФрагмент(<Значение>)| Параметр | Тип | Описание |
|---|---|---|
| Значение | Строка, Неопределено |
Декодированный фрагмент либо признак его удаления |
Тот же объект URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип |
url.invalid_syntax |
Значение содержит недопустимую кодовую точку Unicode |
Пустая строка создаёт определённый пустой фрагмент #. Неопределено полностью удаляет фрагмент.
Возвращает фрагмент после строгого декодирования UTF-8.
.Фрагмент()Строка или Неопределено, если фрагмент отсутствует.
| Код | Условие |
|---|---|
encoding.invalid |
Процентные байты не образуют корректную последовательность UTF-8 |
Разрешает ссылку относительно текущего URL по RFC 3986 § 5.2.
.Разрешить(<Ссылка>)| Параметр | Тип | Описание |
|---|---|---|
| Ссылка | Строка, URL |
Относительная или абсолютная ссылка |
Новый независимый абсолютный URL.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип ссылки |
url.base_not_absolute |
Текущий URL не является абсолютной базой |
| Коды разбора URI | Переданная строка имеет недопустимый синтаксис |
Строит детерминированную URI-ссылку на абсолютную цель относительно текущего URL.
Результат выбирается так, чтобы Разрешить() восстановил цель. Если это невозможно, возвращается абсолютная цель.
.СделатьОтносительным(<Цель>)| Параметр | Тип | Описание |
|---|---|---|
| Цель | Строка, URL |
Абсолютная целевая ссылка |
Новый независимый URL: относительная ссылка либо нормализованная абсолютная цель.
Примеры выбранной формы результата:
| База | Цель | Результат |
|---|---|---|
http://e/a/ |
http://e/a/b |
b |
http://e/a/b/file |
http://e/a/c/file2 |
../c/file2 |
http://e/a/b |
http://e/a/ |
./ |
http://e/a/ |
https://e/a/b |
https://e/a/b |
http://e/a/ |
http://other/a/b |
http://other/a/b |
База с завершающим / рассматривается как каталог. Если схема или серверная часть не позволяют построить
относительную ссылку с тем же смыслом, возвращается абсолютная цель.
| Код | Условие |
|---|---|
argument.invalid_type |
Передан неподдерживаемый тип цели |
argument.invalid_value |
Цель не является абсолютной |
url.base_not_absolute |
Текущий URL не является абсолютной базой |
| Коды разбора URI | Переданная строка имеет недопустимый синтаксис |
Методы сравнивают только представления URI. Они не выполняют сетевые запросы и не гарантируют, что два URI ведут на один ресурс.
Возвращает новый корневой URL для текущих схемы, хоста и порта. Результат состоит из нормализованных схемы и хоста,
нестандартного порта, если он был задан, и пути /. Данные пользователя, исходный путь, строка запроса и фрагмент
в результат не входят.
.Корневой()| Исходный URL | Результат |
|---|---|
HTTPS://user@example.com:443/a?q=1#part |
https://example.com/ |
https://example.com:8443/a |
https://example.com:8443/ |
x://[2001:DB8::A]:1234/a |
x://[2001:db8::a]:1234/ |
Схема, хост и порт нормализуются по тем же правилам, что и в НормализованныйДляСхемы(). Поэтому стандартный порт
из результата удаляется. Исходный объект не изменяется.
RFC 3986 не определяет операцию получения корневого URL. Метод собирает результат из компонентов серверной части,
описанных в RFC 3986 § 3.2, и устанавливает корневой путь
/ в соответствии с синтаксисом пути из
RFC 3986 § 3.3.
Новый независимый URL с корневым путём.
| Код | Условие |
|---|---|
url.server_address_required |
Текущий URL не содержит схему или непустой хост |
Возвращает новый URL после общей нормализации по RFC 3986 § 6.2.2:
- приводит схему и ASCII-символы хоста к нижнему регистру;
- приводит шестнадцатеричные цифры в
%HHк верхнему регистру; - декодирует
%HH, если байт обозначает незарезервированный символ; - сворачивает полные сегменты
.и.., сохраняя смысл относительной ссылки; - удаляет пустой порт и его разделитель по RFC 3986 § 3.2.3.
.Нормализованный()Новый независимый нормализованный URL.
Сначала выполняет все преобразования Нормализованный(), затем применяет правила схемы из
RFC 3986 § 6.2.3:
- удаляет стандартный порт
80дляhttpиws,443дляhttpsиwss,21дляftp; - заменяет пустой путь на
/дляhttp,https,wsиwss, если определена серверная часть.
Для неизвестной схемы результат совпадает с Нормализованный().
.НормализованныйДляСхемы()Новый независимый URL, нормализованный с учётом схемы.
Сравнивает исходные написания текущего URL и другой URI-ссылки без нормализации.
.Равен(<Другое>)| Параметр | Тип | Описание |
|---|---|---|
| Другое | Строка, URL |
Сравниваемая ссылка |
Булево: Истина, если исходные строки совпадают.
| Код | Условие |
|---|---|
argument.invalid_type |
Передано значение другого типа |
| Коды разбора URI | Переданная строка имеет недопустимый синтаксис |
Проверяет совпадение структуры и кодированных данных двух ссылок. Метод вызывает Сравнить() и возвращает
Истина, если результат равен нулю.
Например, HTTP://Example.com/a%2f равен по компонентам http://example.com/a%2F, а /%7E не равен /~.
.РавенПоКомпонентам(<Другое>)| Параметр | Тип | Описание |
|---|---|---|
| Другое | Строка, URL |
Сравниваемая ссылка |
Булево: Истина, если кодированные компоненты равны по указанным правилам.
| Код | Условие |
|---|---|
argument.invalid_type |
Передано значение другого типа |
| Коды разбора URI | Переданная строка имеет недопустимый синтаксис |
Сравнивает ссылки для сортировки по кодированным компонентам. Регистр схемы, хоста и шестнадцатеричных цифр в
%HH не учитывается. Остальные символы сравниваются буквально, без нормализации.
.Сравнить(<Другое>)| Параметр | Тип | Описание |
|---|---|---|
| Другое | Строка, URL |
Сравниваемая ссылка |
Число: меньше нуля, если текущий URL должен идти раньше; больше нуля, если позже; ноль, если ссылки равны по
компонентам. Конкретное значение числа не определено.
| Код | Условие |
|---|---|
argument.invalid_type |
Передано значение другого типа |
| Коды разбора URI | Переданная строка имеет недопустимый синтаксис |
Проверяет эквивалентность по общим правилам URI, не зависящим от схемы. Перед сравнением обе ссылки проходят
Нормализованный().
Например, HTTP://Example.com/a/../%7E эквивалентен http://example.com/~. При этом http://example.com не
эквивалентен http://example.com:80/, поскольку стандартный порт и пустой путь зависят от схемы.
.Эквивалентен(<Другое>)| Параметр | Тип | Описание |
|---|---|---|
| Другое | Строка, URL |
Сравниваемая ссылка |
Булево: Истина, если ссылки эквивалентны после общей нормализации.
| Код | Условие |
|---|---|
argument.invalid_type |
Передано значение другого типа |
| Коды разбора URI | Переданная строка имеет недопустимый синтаксис |
Проверяет эквивалентность с учётом правил известных схем. Перед сравнением обе ссылки проходят
НормализованныйДляСхемы().
Например, http://example.com эквивалентен для схемы http://example.com:80/: порт 80 удаляется, а пустой путь
заменяется на /. Для неизвестной схемы метод работает так же, как Эквивалентен().
.ЭквивалентенДляСхемы(<Другое>)| Параметр | Тип | Описание |
|---|---|---|
| Другое | Строка, URL |
Сравниваемая ссылка |
Булево: Истина, если ссылки эквивалентны после нормализации с учётом схемы.
| Код | Условие |
|---|---|
argument.invalid_type |
Передано значение другого типа |
| Коды разбора URI | Переданная строка имеет недопустимый синтаксис |
Безопасное добавление одного сегмента пути:
#Использовать url
Адрес = Новый URL("https://example.com/files");
Адрес.ДобавитьСегментПути("reports/2025.pdf");
Сообщить(Адрес.ВСтроку());
// https://example.com/files/reports%2F2025.pdfСтрока запроса и параметры веб-формы:
#Использовать url
Адрес = Новый URL("https://example.com/?q=hello+world");
Сообщить(Адрес.СтрокаЗапроса());
// q=hello+world
Адрес.ПараметрыЗапроса().РазобратьКак(
ФорматыПараметровЗапросаURL.ВебФорма()
);
Сообщить(Адрес.ПараметрыЗапроса().Получить("q"));
// hello worldПредставления международного доменного имени:
#Использовать url
Адрес = Новый URL("https://пример.рф/");
Сообщить(Адрес.Хост());
// пример.рф
Сообщить(Адрес.КодированныйХост());
// %D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80.%D1%80%D1%84
Сообщить(Адрес.IDNХост());
// xn--e1afmkfd.xn--p1aiСравнение после общей нормализации и с учётом схемы:
#Использовать url
Первый = Новый URL("http://example.com");
Второй = Новый URL("http://example.com:80/");
Сообщить(Первый.Эквивалентен(Второй));
// Ложь
Сообщить(Первый.ЭквивалентенДляСхемы(Второй));
// Истина