Skip to content

URL

[Стабильно: 2 - Стабильно]

Стабильно: 2 Стабильность: 2 - Стабильно

Исходный код: lib/url.js

Модуль node:url предоставляет утилиты для разрешения и анализа URL-адресов. Доступ к нему можно получить с помощью:

js
import url from 'node:url'
js
const url = require('node:url')

Строки URL и объекты URL

Строка URL — это структурированная строка, содержащая несколько осмысленных компонентов. При анализе возвращается объект URL, содержащий свойства для каждого из этих компонентов.

Модуль node:url предоставляет два API для работы с URL-адресами: устаревший API, специфичный для Node.js, и более новый API, реализующий тот же стандарт URL WHATWG, который используется веб-браузерами.

Ниже приведено сравнение API WHATWG и устаревшего API. Над URL 'https://user:[email protected]:8080/p/a/t/h?query=string#hash' показаны свойства объекта, возвращаемого устаревшим url.parse(). Ниже показаны свойства объекта WHATWG URL.

Свойство origin URL WHATWG включает protocol и host, но не username или password.

text
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                              href                                              │
├──────────┬──┬─────────────────────┬────────────────────────┬───────────────────────────┬───────┤
│ protocol │  │        auth         │          host          │           path            │ hash  │
│          │  │                     ├─────────────────┬──────┼──────────┬────────────────┤       │
│          │  │                     │    hostname     │ port │ pathname │     search     │       │
│          │  │                     │                 │      │          ├─┬──────────────┤       │
│          │  │                     │                 │      │          │ │    query     │       │
"  https:   //    user   :   pass   @ sub.example.com : 8080   /p/a/t/h  ?  query=string   #hash "
│          │  │          │          │    hostname     │ port │          │                │       │
│          │  │          │          ├─────────────────┴──────┤          │                │       │
│ protocol │  │ username │ password │          host          │          │                │       │
├──────────┴──┼──────────┴──────────┼────────────────────────┤          │                │       │
│   origin    │                     │         origin         │ pathname │     search     │ hash  │
├─────────────┴─────────────────────┴────────────────────────┴──────────┴────────────────┴───────┤
│                                              href                                              │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
(Все пробелы в строке "" должны игнорироваться. Они предназначены исключительно для форматирования.)

Разбор строки URL с помощью API WHATWG:

js
const myURL = new URL('https://user::8080/p/a/t/h?query=string#hash')

Разбор строки URL с помощью устаревшего API:

js
import url from 'node:url'
const myURL = url.parse('https://user::8080/p/a/t/h?query=string#hash')
js
const url = require('node:url')
const myURL = url.parse('https://user::8080/p/a/t/h?query=string#hash')

Создание URL из составных частей и получение результирующей строки

Можно создать URL WHATWG из составных частей, используя либо установщики свойств, либо шаблонные литеральные строки:

js
const myURL = new URL('https://example.org')
myURL.pathname = '/a/b/c'
myURL.search = '?d=e'
myURL.hash = '#fgh'
js
const pathname = '/a/b/c'
const search = '?d=e'
const hash = '#fgh'
const myURL = new URL(`https://example.org${pathname}${search}${hash}`)

Чтобы получить созданную строку URL, используйте аксессор свойства href:

js
console.log(myURL.href)

API WHATWG URL

Класс: URL

[История]

ВерсияИзменения
v10.0.0Класс теперь доступен в глобальном объекте.
v7.0.0, v6.13.0Добавлен в: v7.0.0, v6.13.0

Совместимый с браузером класс URL, реализованный в соответствии со стандартом WHATWG URL. Примеры анализа URL можно найти в самом стандарте. Класс URL также доступен в глобальном объекте.

В соответствии с соглашениями браузеров, все свойства объектов URL реализованы как геттеры и сеттеры в прототипе класса, а не как свойства данных в самом объекте. Таким образом, в отличие от устаревших urlObject, использование ключевого слова delete для любых свойств объектов URL (например, delete myURL.protocol, delete myURL.pathname и т. д.) не оказывает никакого эффекта, но все равно возвращает true.

new URL(input[, base])

[История]

ВерсияИзменения
v20.0.0, v18.17.0Требование ICU удалено.
  • input <строка> Абсолютный или относительный входной URL для анализа. Если input является относительным, то требуется base. Если input является абсолютным, base игнорируется. Если input не является строкой, он сначала преобразуется в строку.
  • base <строка> Базовый URL для разрешения, если input не является абсолютным. Если base не является строкой, он сначала преобразуется в строку.

Создает новый объект URL, анализируя input относительно base. Если base передается как строка, он будет анализироваться эквивалентно new URL(base).

js
const myURL = new URL('/foo', 'https://example.org/')
// https://example.org/foo

Конструктор URL доступен как свойство глобального объекта. Его также можно импортировать из встроенного модуля url:

js
import { URL } from 'node:url'
console.log(URL === globalThis.URL) // Выводит 'true'.
js
console.log(URL === require('node:url').URL) // Выводит 'true'.

Будет выброшено исключение TypeError, если input или base не являются допустимыми URL. Обратите внимание, что будет предпринята попытка принудительно преобразовать заданные значения в строки. Например:

js
const myURL = new URL({ toString: () => 'https://example.org/' })
// https://example.org/

Символы Юникода, появляющиеся в имени хоста input, будут автоматически преобразованы в ASCII с использованием алгоритма Punycode.

js
const myURL = new URL('https://測試')
// https://xn--g6w251d/

В случаях, когда заранее неизвестно, является ли input абсолютным URL, и предоставлен base, рекомендуется проверить, что origin объекта URL соответствует ожидаемому.

js
let myURL = new URL('http://Example.com/', 'https://example.org/')
// http://example.com/

myURL = new URL('https://Example.com/', 'https://example.org/')
// https://example.com/

myURL = new URL('foo://Example.com/', 'https://example.org/')
// foo://Example.com/

myURL = new URL('http:Example.com/', 'https://example.org/')
// http://example.com/

myURL = new URL('https:Example.com/', 'https://example.org/')
// https://example.org/Example.com/

myURL = new URL('foo:Example.com/', 'https://example.org/')
// foo:Example.com/

url.hash

Получает и устанавливает фрагмент URL.

js
const myURL = new URL('https://example.org/foo#bar')
console.log(myURL.hash)
// Выводит #bar

myURL.hash = 'baz'
console.log(myURL.href)
// Выводит https://example.org/foo#baz

Недопустимые символы URL, включенные в значение, присвоенное свойству hash, кодируются в процентном формате. Выбор символов для процентного кодирования может несколько отличаться от того, что производят методы url.parse() и url.format().

url.host

Получает и устанавливает часть хоста URL.

js
const myURL = new URL('https://example.org:81/foo')
console.log(myURL.host)
// Выводит example.org:81

myURL.host = 'example.com:82'
console.log(myURL.href)
// Выводит https://example.com:82/foo

Недопустимые значения хоста, присвоенные свойству host, игнорируются.

url.hostname

Получает и устанавливает часть имени хоста URL. Ключевое различие между url.host и url.hostname заключается в том, что url.hostname не включает порт.

js
const myURL = new URL('https://example.org:81/foo')
console.log(myURL.hostname)
// Выводит example.org

// Установка имени хоста не изменяет порт
myURL.hostname = 'example.com'
console.log(myURL.href)
// Выводит https://example.com:81/foo

// Используйте myURL.host для изменения имени хоста и порта
myURL.host = 'example.org:82'
console.log(myURL.href)
// Выводит https://example.org:82/foo

Недопустимые значения имени хоста, присвоенные свойству hostname, игнорируются.

url.href

Получает и устанавливает сериализованный URL.

js
const myURL = new URL('https://example.org/foo')
console.log(myURL.href)
// Выводит https://example.org/foo

myURL.href = 'https://example.com/bar'
console.log(myURL.href)
// Выводит https://example.com/bar

Получение значения свойства href эквивалентно вызову url.toString().

Установка значения этого свойства в новое значение эквивалентна созданию нового объекта URL с помощью new URL(value). Все свойства объекта URL будут изменены.

Если значение, присвоенное свойству href, не является допустимым URL, будет выброшено исключение TypeError.

url.origin

[История]

ВерсияИзменения
v15.0.0Схема "gopher" больше не является специальной, и url.origin теперь возвращает 'null' для неё.

Возвращает доступное только для чтения сериализованное представление начала URL.

js
const myURL = new URL('https://example.org/foo/bar?baz')
console.log(myURL.origin)
// Выводит https://example.org
js
const idnURL = new URL('https://測試')
console.log(idnURL.origin)
// Выводит https://xn--g6w251d

console.log(idnURL.hostname)
// Выводит xn--g6w251d

url.password

Возвращает и устанавливает часть URL, отвечающую за пароль.

js
const myURL = new URL('https://abc:')
console.log(myURL.password)
// Выводит xyz

myURL.password = '123'
console.log(myURL.href)
// Выводит https://abc:/

Недопустимые символы URL, включённые в значение, присвоенное свойству password, подвергаются процентному кодированию. Выбор символов для процентного кодирования может несколько отличаться от того, что производили бы методы url.parse() и url.format().

url.pathname

Возвращает и устанавливает часть URL, отвечающую за путь.

js
const myURL = new URL('https://example.org/abc/xyz?123')
console.log(myURL.pathname)
// Выводит /abc/xyz

myURL.pathname = '/abcdef'
console.log(myURL.href)
// Выводит https://example.org/abcdef?123

Недопустимые символы URL, включённые в значение, присвоенное свойству pathname, подвергаются процентному кодированию. Выбор символов для процентного кодирования может несколько отличаться от того, что производили бы методы url.parse() и url.format().

url.port

[История]

ВерсияИзменения
v15.0.0Схема "gopher" больше не является специальной.

Получает и устанавливает часть порта URL-адреса.

Значение порта может быть числом или строкой, содержащей число в диапазоне от 0 до 65535 (включительно). Установка значения в порт по умолчанию для объекта URL с заданным protocol приведет к тому, что значение port станет пустой строкой ('').

Значение порта может быть пустой строкой, в этом случае порт зависит от протокола/схемы:

протоколпорт
"ftp"21
"file"
"http"80
"https"443
"ws"80
"wss"443

При присвоении значения порту, значение сначала будет преобразовано в строку с помощью .toString().

Если эта строка неверна, но начинается с числа, то ведущее число присваивается port. Если число выходит за указанный выше диапазон, оно игнорируется.

js
const myURL = new URL('https://example.org:8888')
console.log(myURL.port)
// Выводит 8888

// Порты по умолчанию автоматически преобразуются в пустую строку
// (порт по умолчанию для протокола HTTPS — 443)
myURL.port = '443'
console.log(myURL.port)
// Выводит пустую строку
console.log(myURL.href)
// Выводит https://example.org/

myURL.port = 1234
console.log(myURL.port)
// Выводит 1234
console.log(myURL.href)
// Выводит https://example.org:1234/

// Полностью неверные строки порта игнорируются
myURL.port = 'abcd'
console.log(myURL.port)
// Выводит 1234

// Ведущие числа обрабатываются как номер порта
myURL.port = '5678abcd'
console.log(myURL.port)
// Выводит 5678

// Нецелые числа усекаются
myURL.port = 1234.5678
console.log(myURL.port)
// Выводит 1234

// Вне диапазона числа, которые не представлены в экспоненциальной записи,
// будут игнорироваться.
myURL.port = 1e10 // 10000000000, будет проверено на соответствие диапазону, как описано ниже
console.log(myURL.port)
// Выводит 1234

Числа, содержащие десятичную точку, такие как числа с плавающей точкой или числа в экспоненциальной записи, не являются исключением из этого правила. Ведущие числа до десятичной точки будут установлены в качестве порта URL, если они допустимы:

js
myURL.port = 4.567e21
console.log(myURL.port)
// Выводит 4 (потому что это ведущее число в строке '4.567e21')

url.protocol

Получает и устанавливает часть протокола URL-адреса.

js
const myURL = new URL('https://example.org')
console.log(myURL.protocol)
// Выводит https:

myURL.protocol = 'ftp'
console.log(myURL.href)
// Выводит ftp://example.org/

Неверные значения протокола URL-адреса, присваиваемые свойству protocol, игнорируются.

Специальные схемы

[История]

ВерсияИзменения
v15.0.0Схема "gopher" больше не является специальной.

Стандарт WHATWG URL рассматривает несколько схем протоколов URL-адресов как специальные с точки зрения того, как они анализируются и сериализуются. Когда URL-адрес анализируется с использованием одного из этих специальных протоколов, свойство url.protocol может быть изменено на другой специальный протокол, но не может быть изменено на неспециальный протокол и наоборот.

Например, изменение с http на https работает:

js
const u = new URL('http://example.org')
u.protocol = 'https'
console.log(u.href)
// https://example.org/

Однако изменение с http на гипотетический протокол fish не работает, потому что новый протокол не является специальным.

js
const u = new URL('http://example.org')
u.protocol = 'fish'
console.log(u.href)
// http://example.org/

Аналогично, изменение с неспециального протокола на специальный протокол также не допускается:

js
const u = new URL('fish://example.org')
u.protocol = 'http'
console.log(u.href)
// fish://example.org

Согласно стандарту WHATWG URL, специальными схемами протоколов являются ftp, file, http, https, ws и wss.

url.search

Получает и устанавливает сериализованную часть запроса URL-адреса.

js
const myURL = new URL('https://example.org/abc?123')
console.log(myURL.search)
// Выводит ?123

myURL.search = 'abc=xyz'
console.log(myURL.href)
// Выводит https://example.org/abc?abc=xyz

Любые недопустимые символы URL-адреса, появляющиеся в значении, присвоенном свойству search, будут процентно-кодированы. Выбор символов для процентного кодирования может несколько отличаться от того, что будут производить методы url.parse() и url.format().

url.searchParams

Возвращает объект URLSearchParams, представляющий параметры запроса URL-адреса. Это свойство доступно только для чтения, но предоставленный им объект URLSearchParams может использоваться для изменения экземпляра URL; чтобы заменить все параметры запроса URL-адреса, используйте установщик url.search. Подробности см. в документации по URLSearchParams.

Будьте осторожны при использовании .searchParams для изменения URL, поскольку, согласно спецификации WHATWG, объект URLSearchParams использует другие правила для определения символов, которые необходимо кодировать в процентном формате. Например, объект URL не будет кодировать в процентном формате символ ASCII тильда (~), в то время как URLSearchParams всегда будет его кодировать:

js
const myURL = new URL('https://example.org/abc?foo=~bar')

console.log(myURL.search) // выводит ?foo=~bar

// Изменение URL через searchParams...
myURL.searchParams.sort()

console.log(myURL.search) // выводит ?foo=%7Ebar

url.username

Возвращает и устанавливает часть имени пользователя URL-адреса.

js
const myURL = new URL('https://abc:')
console.log(myURL.username)
// Выводит abc

myURL.username = '123'
console.log(myURL.href)
// Выводит https://123:/

Любые недопустимые символы URL, появляющиеся в значении, присвоенном свойству username, будут кодированы в процентном формате. Выбор символов для кодировки в процентном формате может несколько отличаться от того, что производили бы методы url.parse() и url.format().

url.toString()

Метод toString() объекта URL возвращает сериализованный URL-адрес. Возвращаемое значение эквивалентно значению url.href и url.toJSON().

url.toJSON()

Добавлено в: v7.7.0, v6.13.0

Метод toJSON() объекта URL возвращает сериализованный URL. Возвращаемое значение эквивалентно значению url.href и url.toString().

Этот метод вызывается автоматически, когда объект URL сериализуется с помощью JSON.stringify().

js
const myURLs = [new URL('https://www.example.com'), new URL('https://test.example.org')]
console.log(JSON.stringify(myURLs))
// Выводит ["https://www.example.com/","https://test.example.org/"]

URL.createObjectURL(blob)

Добавлено в: v16.7.0

[Stable: 1 - Experimental]

Stable: 1 Stability: 1 - Experimental

Создает строку URL 'blob:nodedata:...', представляющую заданный объект <Blob>, который может быть использован для последующего получения Blob.

js
const { Blob, resolveObjectURL } = require('node:buffer')

const blob = new Blob(['hello'])
const id = URL.createObjectURL(blob)

// позже...

const otherBlob = resolveObjectURL(id)
console.log(otherBlob.size)

Данные, хранящиеся зарегистрированным объектом <Blob>, будут храниться в памяти до тех пор, пока не будет вызван URL.revokeObjectURL() для их удаления.

Объекты Blob регистрируются в текущем потоке. При использовании потоков Worker, объекты Blob, зарегистрированные в одном Worker, будут недоступны для других worker'ов или основного потока.

URL.revokeObjectURL(id)

Добавлено в: v16.7.0

[Stable: 1 - Experimental]

Stable: 1 Stability: 1 - Experimental

  • id <string> Строка URL 'blob:nodedata:..., возвращенная предыдущим вызовом URL.createObjectURL().

Удаляет хранящийся <Blob>, идентифицированный заданным ID. Попытка отозвать не зарегистрированный ID завершится без ошибок.

URL.canParse(input[, base])

Добавлено в: v19.9.0, v18.17.0

  • input <строка> Абсолютный или относительный URL-адрес для анализа. Если input является относительным, то base является обязательным. Если input является абсолютным, то base игнорируется. Если input не является строкой, он сначала преобразуется в строку.
  • base <строка> Базовый URL-адрес для разрешения, если input не является абсолютным. Если base не является строкой, он сначала преобразуется в строку.
  • Возвращает: <булево>

Проверяет, может ли input относительно base быть разобран как URL.

js
const isValid = URL.canParse('/foo', 'https://example.org/') // true

const isNotValid = URL.canParse('/foo') // false

URL.parse(input[, base])

Добавлено в: v22.1.0

  • input <строка> Абсолютный или относительный URL-адрес для анализа. Если input является относительным, то base является обязательным. Если input является абсолютным, то base игнорируется. Если input не является строкой, он сначала преобразуется в строку.
  • base <строка> Базовый URL-адрес для разрешения, если input не является абсолютным. Если base не является строкой, он сначала преобразуется в строку.
  • Возвращает: <URL> | <null>

Разбирает строку как URL. Если base предоставлен, он будет использоваться в качестве базового URL-адреса для разрешения неабсолютных URL-адресов input. Возвращает null, если input не является допустимым.

Класс: URLSearchParams

[История]

ВерсияИзменения
v10.0.0Класс теперь доступен в глобальном объекте.
v7.5.0, v6.13.0Добавлен в: v7.5.0, v6.13.0

API URLSearchParams обеспечивает доступ для чтения и записи к запросу URL. Класс URLSearchParams также может использоваться автономно с одним из четырех следующих конструкторов. Класс URLSearchParams также доступен в глобальном объекте.

Интерфейс WHATWG URLSearchParams и модуль querystring имеют схожее назначение, но назначение модуля querystring более общее, поскольку он позволяет настраивать разделительные символы (& и =). С другой стороны, этот API предназначен исключительно для строковых запросов URL.

js
const myURL = new URL('https://example.org/?abc=123')
console.log(myURL.searchParams.get('abc'))
// Выводит 123

myURL.searchParams.append('abc', 'xyz')
console.log(myURL.href)
// Выводит https://example.org/?abc=123&abc=xyz

myURL.searchParams.delete('abc')
myURL.searchParams.set('a', 'b')
console.log(myURL.href)
// Выводит https://example.org/?a=b

const newSearchParams = new URLSearchParams(myURL.searchParams)
// Вышеприведенный код эквивалентен
// const newSearchParams = new URLSearchParams(myURL.search);

newSearchParams.append('a', 'c')
console.log(myURL.href)
// Выводит https://example.org/?a=b
console.log(newSearchParams.toString())
// Выводит a=b&a=c

// newSearchParams.toString() вызывается неявно
myURL.search = newSearchParams
console.log(myURL.href)
// Выводит https://example.org/?a=b&a=c
newSearchParams.delete('a')
console.log(myURL.href)
// Выводит https://example.org/?a=b&a=c

new URLSearchParams()

Создает новый пустой объект URLSearchParams.

new URLSearchParams(string)

Разбирает string как строку запроса и использует ее для создания нового объекта URLSearchParams. Ведущий символ '?', если он присутствует, игнорируется.

js
let params

params = new URLSearchParams('user=abc&query=xyz')
console.log(params.get('user'))
// Выводит 'abc'
console.log(params.toString())
// Выводит 'user=abc&query=xyz'

params = new URLSearchParams('?user=abc&query=xyz')
console.log(params.toString())
// Выводит 'user=abc&query=xyz'

new URLSearchParams(obj)

Добавлено в: v7.10.0, v6.13.0

  • obj <Object> Объект, представляющий собой коллекцию пар «ключ-значение»

Создает новый объект URLSearchParams с помощью хеш-карты запроса. Ключ и значение каждого свойства obj всегда преобразуются в строки.

В отличие от модуля querystring, дубликаты ключей в виде значений массива не допускаются. Массивы преобразуются в строки с помощью array.toString(), который просто соединяет все элементы массива запятыми.

js
const params = new URLSearchParams({
  user: 'abc',
  query: ['first', 'second'],
})
console.log(params.getAll('query'))
// Выведет [ 'first,second' ]
console.log(params.toString())
// Выведет 'user=abc&query=first%2Csecond'

new URLSearchParams(iterable)

Добавлено в: v7.10.0, v6.13.0

  • iterable <Iterable> Итерируемый объект, элементы которого представляют собой пары «ключ-значение»

Создает новый объект URLSearchParams с помощью итерируемой карты, подобно конструктору Map. iterable может быть Array или любым итерируемым объектом. Это означает, что iterable может быть другим URLSearchParams, в этом случае конструктор просто создаст клон предоставленного URLSearchParams. Элементы iterable представляют собой пары «ключ-значение» и сами могут быть любыми итерируемыми объектами.

Дубликаты ключей допускаются.

js
let params

// Использование массива
params = new URLSearchParams([
  ['user', 'abc'],
  ['query', 'first'],
  ['query', 'second'],
])
console.log(params.toString())
// Выведет 'user=abc&query=first&query=second'

// Использование объекта Map
const map = new Map()
map.set('user', 'abc')
map.set('query', 'xyz')
params = new URLSearchParams(map)
console.log(params.toString())
// Выведет 'user=abc&query=xyz'

// Использование функции-генератора
function* getQueryPairs() {
  yield ['user', 'abc']
  yield ['query', 'first']
  yield ['query', 'second']
}
params = new URLSearchParams(getQueryPairs())
console.log(params.toString())
// Выведет 'user=abc&query=first&query=second'

// Каждая пара ключ-значение должна содержать ровно два элемента
new URLSearchParams([['user', 'abc', 'error']])
// Выбросит TypeError [ERR_INVALID_TUPLE]:
//        Каждая пара запроса должна быть итерируемым кортежем [имя, значение]

urlSearchParams.append(name, value)

Добавляет новую пару «имя-значение» в строку запроса.

urlSearchParams.delete(name[, value])

[История]

ВерсияИзменения
v20.2.0, v18.18.0Добавлена поддержка необязательного аргумента value.

Если указан value, удаляет все пары «имя-значение», где имя — это name, а значение — это value.

Если value не указан, удаляет все пары «имя-значение», имя которых равно name.

urlSearchParams.entries()

Возвращает итератор ES6 для каждой пары «имя-значение» в запросе. Каждый элемент итератора — это массив JavaScript. Первый элемент массива — это name, второй элемент массива — это value.

Псевдоним для urlSearchParams[@@iterator]().

urlSearchParams.forEach(fn[, thisArg])

[История]

ВерсияИзменения
v18.0.0Передача недопустимого обратного вызова в аргумент fn теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
  • fn <Функция> Вызывается для каждой пары «имя-значение» в запросе
  • thisArg <Объект> Используется в качестве значения this при вызове fn

Перебирает каждую пару «имя-значение» в запросе и вызывает заданную функцию.

js
const myURL = new URL('https://example.org/?a=b&c=d')
myURL.searchParams.forEach((value, name, searchParams) => {
  console.log(name, value, myURL.searchParams === searchParams)
})
// Выводит:
//   a b true
//   c d true

urlSearchParams.get(name)

  • name <string>
  • Возвращает: <string> | <null> Строку или null, если нет пары имя-значение с заданным name.

Возвращает значение первой пары имя-значение, имя которой — name. Если таких пар нет, возвращается null.

urlSearchParams.getAll(name)

Возвращает значения всех пар имя-значение, имя которых — name. Если таких пар нет, возвращается пустой массив.

urlSearchParams.has(name[, value])

[История]

ВерсияИзменения
v20.2.0, v18.18.0Добавлена поддержка необязательного аргумента value.

Проверяет, содержит ли объект URLSearchParams пару(ы) ключ-значение на основе name и необязательного аргумента value.

Если value указан, возвращает true, если существует пара имя-значение с тем же name и value.

Если value не указан, возвращает true, если существует хотя бы одна пара имя-значение, имя которой — name.

urlSearchParams.keys()

Возвращает итератор ES6 по именам каждой пары имя-значение.

js
const params = new URLSearchParams('foo=bar&foo=baz')
for (const name of params.keys()) {
  console.log(name)
}
// Выводит:
//   foo
//   foo

urlSearchParams.set(name, value)

Устанавливает значение в объекте URLSearchParams, связанное с name, равное value. Если уже существуют пары «имя-значение», имена которых совпадают с name, устанавливает значение первой такой пары равным value и удаляет все остальные. В противном случае добавляет пару «имя-значение» к строке запроса.

js
const params = new URLSearchParams()
params.append('foo', 'bar')
params.append('foo', 'baz')
params.append('abc', 'def')
console.log(params.toString())
// Выводит foo=bar&foo=baz&abc=def

params.set('foo', 'def')
params.set('xyz', 'opq')
console.log(params.toString())
// Выводит foo=def&abc=def&xyz=opq

urlSearchParams.size

Добавлено в: v19.8.0, v18.16.0

Общее количество записей параметров.

urlSearchParams.sort()

Добавлено в: v7.7.0, v6.13.0

Сортирует все существующие пары «имя-значение» на месте по их именам. Сортировка выполняется с использованием стабильного алгоритма сортировки, поэтому относительный порядок между парами «имя-значение» с одинаковым именем сохраняется.

Этот метод может использоваться, в частности, для увеличения количества попаданий в кэш.

js
const params = new URLSearchParams('query[]=abc&type=search&query[]=123')
params.sort()
console.log(params.toString())
// Выводит query%5B%5D=abc&query%5B%5D=123&type=search

urlSearchParams.toString()

Возвращает параметры поиска, сериализованные в виде строки, с символами, закодированными в процентах, где это необходимо.

urlSearchParams.values()

Возвращает итератор ES6 для значений каждой пары «имя-значение».

urlSearchParams[Symbol.iterator]()

Возвращает итератор ES6 для каждой пары имя-значение в строке запроса. Каждый элемент итератора — это массив JavaScript. Первый элемент массива — это name, второй элемент массива — это value.

Псевдоним для urlSearchParams.entries().

js
const params = new URLSearchParams('foo=bar&xyz=baz')
for (const [name, value] of params) {
  console.log(name, value)
}
// Выводит:
//   foo bar
//   xyz baz

url.domainToASCII(domain)

[История]

ВерсияИзменения
v20.0.0, v18.17.0Удалено требование ICU.
v7.4.0, v6.13.0Добавлено в: v7.4.0, v6.13.0

Возвращает ASCII-сериализацию domain в кодировке Punycode. Если domain — недопустимый домен, возвращается пустая строка.

Выполняет обратную операцию к url.domainToUnicode().

js
import url from 'node:url'

console.log(url.domainToASCII('español.com'))
// Выводит xn--espaol-zwa.com
console.log(url.domainToASCII('中文.com'))
// Выводит xn--fiq228c.com
console.log(url.domainToASCII('xn--iñvalid.com'))
// Выводит пустую строку
js
const url = require('node:url')

console.log(url.domainToASCII('español.com'))
// Выводит xn--espaol-zwa.com
console.log(url.domainToASCII('中文.com'))
// Выводит xn--fiq228c.com
console.log(url.domainToASCII('xn--iñvalid.com'))
// Выводит пустую строку

url.domainToUnicode(domain)

[История]

ВерсияИзменения
v20.0.0, v18.17.0Удалено требование ICU.
v7.4.0, v6.13.0Добавлено в: v7.4.0, v6.13.0

Возвращает Юникод-сериализацию domain. Если domain — недопустимый домен, возвращается пустая строка.

Выполняет обратную операцию к url.domainToASCII().

js
import url from 'node:url'

console.log(url.domainToUnicode('xn--espaol-zwa.com'))
// Выводит español.com
console.log(url.domainToUnicode('xn--fiq228c.com'))
// Выводит 中文.com
console.log(url.domainToUnicode('xn--iñvalid.com'))
// Выводит пустую строку
js
const url = require('node:url')

console.log(url.domainToUnicode('xn--espaol-zwa.com'))
// Выводит español.com
console.log(url.domainToUnicode('xn--fiq228c.com'))
// Выводит 中文.com
console.log(url.domainToUnicode('xn--iñvalid.com'))
// Выводит пустую строку

url.fileURLToPath(url[, options])

[История]

ВерсияИзменения
v22.1.0, v20.13.0Теперь аргумент options можно использовать для определения способа анализа аргумента path.
v10.12.0Добавлено в: v10.12.0
  • url <URL> | <строка> Строка URL файла или объект URL для преобразования в путь.

  • options <Объект>

    • windows <булево> | <неопределено> true, если path должен возвращаться как путь к файлу Windows, false для POSIX и undefined для системных значений по умолчанию. По умолчанию: undefined.
  • Возвращает: <строка> Полностью разрешенный путь к файлу Node.js, зависящий от платформы.

Эта функция обеспечивает правильное декодирование символов, закодированных в процентах, а также гарантирует создание правильной абсолютной строки пути для разных платформ.

js
import { fileURLToPath } from 'node:url'

const __filename = fileURLToPath(import.meta.url)

new URL('file:///C:/path/').pathname // Неверно: /C:/path/
fileURLToPath('file:///C:/path/') // Верно:   C:\path\ (Windows)

new URL('file://nas/foo.txt').pathname // Неверно: /foo.txt
fileURLToPath('file://nas/foo.txt') // Верно:   \\nas\foo.txt (Windows)

new URL('file:///你好.txt').pathname // Неверно: /%E4%BD%A0%E5%A5%BD.txt
fileURLToPath('file:///你好.txt') // Верно:   /你好.txt (POSIX)

new URL('file:///hello world').pathname // Неверно: /hello%20world
fileURLToPath('file:///hello world') // Верно:   /hello world (POSIX)
js
const { fileURLToPath } = require('node:url')
new URL('file:///C:/path/').pathname // Неверно: /C:/path/
fileURLToPath('file:///C:/path/') // Верно:   C:\path\ (Windows)

new URL('file://nas/foo.txt').pathname // Неверно: /foo.txt
fileURLToPath('file://nas/foo.txt') // Верно:   \\nas\foo.txt (Windows)

new URL('file:///你好.txt').pathname // Неверно: /%E4%BD%A0%E5%A5%BD.txt
fileURLToPath('file:///你好.txt') // Верно:   /你好.txt (POSIX)

new URL('file:///hello world').pathname // Неверно: /hello%20world
fileURLToPath('file:///hello world') // Верно:   /hello world (POSIX)

url.format(URL[, options])

Добавлено в: v7.6.0

  • URL <URL> Объект WHATWG URL

  • options <Object>

    • auth <boolean> true, если строковое представление URL должно включать имя пользователя и пароль, false в противном случае. По умолчанию: true.
    • fragment <boolean> true, если строковое представление URL должно включать фрагмент, false в противном случае. По умолчанию: true.
    • search <boolean> true, если строковое представление URL должно включать поисковый запрос, false в противном случае. По умолчанию: true.
    • unicode <boolean> true, если символы Unicode, встречающиеся в компоненте host строкового представления URL, должны кодироваться напрямую, а не кодироваться Punycode. По умолчанию: false.
  • Возвращает: <string>

Возвращает настраиваемое строковое представление WHATWG URL объекта.

Объект URL имеет как метод toString(), так и свойство href, которые возвращают строковые представления URL. Однако они не являются настраиваемыми. Метод url.format(URL[, options]) позволяет выполнить базовую настройку вывода.

js
import url from 'node:url'
const myURL = new URL('https://a:b@測試?abc#foo')

console.log(myURL.href)
// Выводит https://a:b@xn--g6w251d/?abc#foo

console.log(myURL.toString())
// Выводит https://a:b@xn--g6w251d/?abc#foo

console.log(url.format(myURL, { fragment: false, unicode: true, auth: false }))
// Выводит 'https://測試/?abc'
js
const url = require('node:url')
const myURL = new URL('https://a:b@測試?abc#foo')

console.log(myURL.href)
// Выводит https://a:b@xn--g6w251d/?abc#foo

console.log(myURL.toString())
// Выводит https://a:b@xn--g6w251d/?abc#foo

console.log(url.format(myURL, { fragment: false, unicode: true, auth: false }))
// Выводит 'https://測試/?abc'

url.pathToFileURL(path[, options])

[История]

ВерсияИзменения
v22.1.0, v20.13.0Теперь аргумент options можно использовать для определения способа возвращения значения path.
v10.12.0Добавлено в: v10.12.0
  • path <строка> Путь, который нужно преобразовать в URL файла.

  • options <Объект>

    • windows <булево> | <неопределено> true, если path должен обрабатываться как путь к файлу в Windows, false для POSIX и undefined для системных значений по умолчанию. По умолчанию: undefined.
  • Возвращает: <URL> Объект URL файла.

Эта функция гарантирует, что path разрешается абсолютно, и что управляющие символы URL правильно кодируются при преобразовании в URL файла.

js
import { pathToFileURL } from 'node:url'

new URL('/foo#1', 'file:') // Неверно: file:///foo#1
pathToFileURL('/foo#1') // Верно:   file:///foo%231 (POSIX)

new URL('/some/path%.c', 'file:') // Неверно: file:///some/path%.c
pathToFileURL('/some/path%.c') // Верно:   file:///some/path%25.c (POSIX)
js
const { pathToFileURL } = require('node:url')
new URL(__filename) // Неверно: вызывает ошибку (POSIX)
new URL(__filename) // Неверно: C:\... (Windows)
pathToFileURL(__filename) // Верно:   file:///... (POSIX)
pathToFileURL(__filename) // Верно:   file:///C:/... (Windows)

new URL('/foo#1', 'file:') // Неверно: file:///foo#1
pathToFileURL('/foo#1') // Верно:   file:///foo%231 (POSIX)

new URL('/some/path%.c', 'file:') // Неверно: file:///some/path%.c
pathToFileURL('/some/path%.c') // Верно:   file:///some/path%25.c (POSIX)

url.urlToHttpOptions(url)

[История]

ВерсияИзменения
v19.9.0, v18.17.0Возвращаемый объект будет также содержать все собственные перечисляемые свойства аргумента url.
v15.7.0, v14.18.0Добавлено в: v15.7.0, v14.18.0
  • url <URL> Объект WHATWG URL для преобразования в объект параметров.
  • Возвращает: <Object> Объект параметров
    • protocol <string> Используемый протокол.
    • hostname <string> Доменное имя или IP-адрес сервера, к которому нужно отправить запрос.
    • hash <string> Фрагмент URL-адреса.
    • search <string> Сериализованная часть запроса URL-адреса.
    • pathname <string> Часть пути URL-адреса.
    • path <string> Путь запроса. Должен включать строку запроса, если таковая имеется. Например, '/index.html?page=12'. Выбрасывается исключение, если путь запроса содержит недопустимые символы. В настоящее время отклоняются только пробелы, но это может измениться в будущем.
    • href <string> Сериализованный URL-адрес.
    • port <number> Порт удаленного сервера.
    • auth <string> Базовая аутентификация, например, 'user:password' для вычисления заголовка Authorization.

Эта служебная функция преобразует объект URL в обычный объект параметров, как это ожидается API http.request() и https.request().

js
import { urlToHttpOptions } from 'node:url'
const myURL = new URL('https://a:b@測試?abc#foo')

console.log(urlToHttpOptions(myURL))
/*
{
  protocol: 'https:',
  hostname: 'xn--g6w251d',
  hash: '#foo',
  search: '?abc',
  pathname: '/',
  path: '/?abc',
  href: 'https://a:b@xn--g6w251d/?abc#foo',
  auth: 'a:b'
}
*/
js
const { urlToHttpOptions } = require('node:url')
const myURL = new URL('https://a:b@測試?abc#foo')

console.log(urlToHttpOptions(myURL))
/*
{
  protocol: 'https:',
  hostname: 'xn--g6w251d',
  hash: '#foo',
  search: '?abc',
  pathname: '/',
  path: '/?abc',
  href: 'https://a:b@xn--g6w251d/?abc#foo',
  auth: 'a:b'
}
*/

Устаревший API URL

[История]

ВерсияИзменения
v15.13.0, v14.17.0Отмена снятия с поддержки. Статус изменён на "Устаревший".
v11.0.0Этот API устарел.

[Стабильность: 3 - Устаревший]

Стабильность: 3 Стабильность: 3 - Устаревший: Используйте API URL WHATWG вместо этого.

Устаревший urlObject

[История]

ВерсияИзменения
v15.13.0, v14.17.0Отмена снятия с поддержки. Статус изменён на "Устаревший".
v11.0.0Устаревший API URL снят с поддержки. Используйте API URL WHATWG.

[Стабильность: 3 - Устаревший]

Стабильность: 3 Стабильность: 3 - Устаревший: Используйте API URL WHATWG вместо этого.

Устаревший urlObject (require('node:url').Url или import { Url } from 'node:url') создаётся и возвращается функцией url.parse().

urlObject.auth

Свойство auth — это часть URL, содержащая имя пользователя и пароль, также называемая userinfo. Эта подстрока следует за protocol и двумя косыми чертами (если они присутствуют) и предшествует компоненту host, разделяясь символом @. Строка представляет собой либо имя пользователя, либо имя пользователя и пароль, разделённые двоеточием.

Например: 'user:pass'.

urlObject.hash

Свойство hash — это часть URL, представляющая фрагмент идентификатора, включая начальный символ #.

Например: '#hash'.

urlObject.host

Свойство host — это полная строка хоста в нижнем регистре, включая port, если он указан.

Например: 'sub.example.com:8080'.

urlObject.hostname

Свойство hostname — это имя хоста в нижнем регистре из компонента host без включения port.

Например: 'sub.example.com'.

urlObject.href

Свойство href — это полная строка URL, которая была обработана, с компонентами protocol и host, преобразованными в нижний регистр.

Например: 'http://user:[email protected]:8080/p/a/t/h?query=string#hash'.

urlObject.path

Свойство path представляет собой конкатенацию компонентов pathname и search.

Например: '/p/a/t/h?query=string'.

Декодирование path не выполняется.

urlObject.pathname

Свойство pathname состоит из всего раздела пути URL-адреса. Это все, что следует за host (включая port) и предшествует началу компонентов query или hash, разделенных символами ASCII «вопросительный знак» (?) или «решётка» (#).

Например: '/p/a/t/h'.

Декодирование строки пути не выполняется.

urlObject.port

Свойство port — это числовая часть порта компонента host.

Например: '8080'.

urlObject.protocol

Свойство protocol определяет схему протокола URL-адреса в нижнем регистре.

Например: 'http:'.

urlObject.query

Свойство query представляет собой либо строку запроса без ведущего символа ASCII «вопросительный знак» (?), либо объект, возвращаемый методом parse() модуля querystring. Является ли свойство query строкой или объектом, определяется аргументом parseQueryString, переданным в url.parse().

Например: 'query=string' или {'query': 'string'}.

Если возвращается как строка, декодирование строки запроса не выполняется. Если возвращается как объект, декодируются как ключи, так и значения.

urlObject.search

Свойство search состоит из всей части «строки запроса» URL-адреса, включая ведущий символ ASCII «вопросительный знак» (?).

Например: '?query=string'.

Декодирование строки запроса не выполняется.

urlObject.slashes

Свойство slashes имеет тип boolean со значением true, если после двоеточия в protocol требуются два символа ASCII «косая черта» (/).

url.format(urlObject)

[История]

ВерсияИзменения
v17.0.0Теперь выбрасывает исключение ERR_INVALID_URL, когда преобразование имени узла в Punycode вносит изменения, которые могут привести к другому разбору URL-адреса.
v15.13.0, v14.17.0Отзыв отмены устаревания. Статус изменён на «Устаревший».
v11.0.0API URL устаревшего типа объявлен устаревшим. Используйте API URL WHATWG.
v7.0.0URL-адреса со схемой file: теперь всегда будут использовать правильное количество косых черт независимо от параметра slashes. Ложное значение параметра slashes без протокола теперь также всегда учитывается.
v0.1.25Добавлено в: v0.1.25

[Стабильно: 3 - Устаревший]

Стабильно: 3 Стабильность: 3 - Устаревший: Используйте вместо этого API URL WHATWG.

  • urlObject <Объект> | <строка> Объект URL (как возвращается url.parse() или создаётся иным образом). Если строка, она преобразуется в объект путём передачи её в url.parse().

Метод url.format() возвращает отформатированную строку URL, полученную из urlObject.

js
const url = require('node:url')
url.format({
  protocol: 'https',
  hostname: 'example.com',
  pathname: '/some/path',
  query: {
    page: 1,
    format: 'json',
  },
})

// => 'https://example.com/some/path?page=1&format=json'

Если urlObject не является объектом или строкой, url.format() выбросит TypeError.

Процесс форматирования работает следующим образом:

  • Создаётся новая пустая строка result.

  • Если urlObject.protocol является строкой, она добавляется как есть к result.

  • В противном случае, если urlObject.protocol не является undefined и не является строкой, выбрасывается Error.

  • Для всех строковых значений urlObject.protocol, которые не заканчиваются символом ASCII «двоеточие» (:) , литеральная строка : будет добавлена к result.

  • Если выполняется хотя бы одно из следующих условий, то литеральная строка // будет добавлена к result:

    • свойство urlObject.slashes равно true;
    • urlObject.protocol начинается с http, https, ftp, gopher или file;
  • Если значение свойства urlObject.auth истинно, и urlObject.host или urlObject.hostname не являются undefined, значение urlObject.auth будет приведено к строке и добавлено к result, за которым следует литеральная строка @.

  • Если свойство urlObject.host равно undefined, то:

    • Если urlObject.hostname является строкой, она добавляется к result.
    • В противном случае, если urlObject.hostname не является undefined и не является строкой, выбрасывается Error.
    • Если значение свойства urlObject.port истинно, и urlObject.hostname не является undefined:
    • Литеральная строка : добавляется к result, и
    • Значение urlObject.port приводится к строке и добавляется к result.
  • В противном случае, если значение свойства urlObject.host истинно, значение urlObject.host приводится к строке и добавляется к result.

  • Если свойство urlObject.pathname является строкой, которая не является пустой строкой:

    • Если urlObject.pathname не начинается с косой черты ASCII (/), то литеральная строка '/' добавляется к result.
    • Значение urlObject.pathname добавляется к result.
  • В противном случае, если urlObject.pathname не является undefined и не является строкой, выбрасывается Error.

  • Если свойство urlObject.search равно undefined, и если свойство urlObject.query является Object, литеральная строка ? добавляется к result, за которой следует результат вызова метода stringify() модуля querystring с передачей значения urlObject.query.

  • В противном случае, если urlObject.search является строкой:

    • Если значение urlObject.search не начинается с символа ASCII «вопросительный знак» (?), литеральная строка ? добавляется к result.
    • Значение urlObject.search добавляется к result.
  • В противном случае, если urlObject.search не является undefined и не является строкой, выбрасывается Error.

  • Если свойство urlObject.hash является строкой:

    • Если значение urlObject.hash не начинается с символа ASCII «решётка» (#), литеральная строка # добавляется к result.
    • Значение urlObject.hash добавляется к result.
  • В противном случае, если свойство urlObject.hash не является undefined и не является строкой, выбрасывается Error.

  • Возвращается result.

url.parse(urlString[, parseQueryString[, slashesDenoteHost]])

[История]

ВерсияИзменения
v19.0.0, v18.13.0Устаревание только в документации.
v15.13.0, v14.17.0Отмена устаревания. Статус изменён на "Устаревший".
v11.14.0Свойство pathname в возвращаемом объекте URL теперь равно /, если путь отсутствует, а схемой протокола является ws: или wss:.
v11.0.0Устаревший API URL объявлен устаревшим. Используйте API URL WHATWG.
v9.0.0Свойство search в возвращаемом объекте URL теперь равно null, если строка запроса отсутствует.
v0.1.25Добавлено в: v0.1.25

[Стабильность: 0 - Устарело]

Стабильность: 0 Стабильность: 0 - Устарело: Используйте API URL WHATWG вместо этого.

  • urlString <строка> Строка URL для анализа.
  • parseQueryString <булево> Если true, свойство query всегда будет установлено в объект, возвращаемый методом parse() модуля querystring. Если false, свойство query в возвращаемом объекте URL будет необработанной, нераскодированной строкой. По умолчанию: false.
  • slashesDenoteHost <булево> Если true, первый токен после литеральной строки // и перед следующим / будет интерпретироваться как host. Например, для //foo/bar результатом будет {host: 'foo', pathname: '/bar'} вместо {pathname: '//foo/bar'}. По умолчанию: false.

Метод url.parse() принимает строку URL, анализирует её и возвращает объект URL.

Выбрасывается TypeError, если urlString не является строкой.

Выбрасывается URIError, если свойство auth присутствует, но не может быть декодировано.

url.parse() использует либеральный, нестандартный алгоритм для анализа строк URL. Он подвержен проблемам безопасности, таким как подмена имени хоста и неправильная обработка имён пользователей и паролей. Не используйте с ненадежными данными. Уязвимости url.parse() не регистрируются как CVE. Используйте вместо этого API WHATWG URL.

url.resolve(from, to)

[История]

ВерсияИзменения
v15.13.0, v14.17.0Отмена устаревания. Статус изменён на "Устаревший".
v11.0.0Устаревший API URL объявлен устаревшим. Используйте API URL WHATWG.
v6.6.0Поля auth теперь сохраняются, когда from и to ссылаются на один и тот же хост.
v6.0.0Поля auth очищаются, если параметр to содержит имя хоста.
v6.5.0, v4.6.2Поле port теперь копируется корректно.
v0.1.25Добавлено в: v0.1.25

[Стабильность: 3 - Устаревший]

Стабильность: 3 Стабильность: 3 - Устаревший: Используйте API URL WHATWG вместо этого.

  • from <строка> Базовый URL, который будет использоваться, если to является относительным URL.
  • to <строка> Целевой URL для разрешения.

Метод url.resolve() разрешает целевой URL относительно базового URL аналогично тому, как веб-браузер разрешает тег якоря.

js
const url = require('node:url')
url.resolve('/one/two/three', 'four') // '/one/two/four'
url.resolve('http://example.com/', '/one') // 'http://example.com/one'
url.resolve('http://example.com/one', '/two') // 'http://example.com/two'

Чтобы достичь того же результата с использованием API URL WHATWG:

js
function resolve(from, to) {
  const resolvedUrl = new URL(to, new URL(from, 'resolve://'))
  if (resolvedUrl.protocol === 'resolve:') {
    // `from` является относительным URL.
    const { pathname, search, hash } = resolvedUrl
    return pathname + search + hash
  }
  return resolvedUrl.toString()
}

resolve('/one/two/three', 'four') // '/one/two/four'
resolve('http://example.com/', '/one') // 'http://example.com/one'
resolve('http://example.com/one', '/two') // 'http://example.com/two'

Процентное кодирование в URL

URL допускают использование только определенного диапазона символов. Любой символ, выходящий за этот диапазон, должен быть закодирован. Способ кодирования таких символов и то, какие символы кодировать, полностью зависят от того, где символ находится в структуре URL.

Устаревший API

В устаревшем API пробелы (' ') и следующие символы будут автоматически экранироваться в свойствах объектов URL:

text
< > " ` \r \n \t { } | \ ^ '

Например, символ ASCII-пробела (' ') кодируется как %20. Символ ASCII-косой черты (/) кодируется как %3C.

API WHATWG

Стандарт URL WHATWG использует более избирательный и детализированный подход к выбору кодируемых символов, чем устаревший API.

Алгоритм WHATWG определяет четыре "набора символов для процентого кодирования", которые описывают диапазоны символов, которые должны быть закодированы с помощью процентного кодирования:

  • Набор символов для процентого кодирования C0 включает в себя кодовые точки в диапазоне U+0000–U+001F (включительно) и все кодовые точки больше U+007E (~).
  • Набор символов для процентого кодирования фрагмента включает в себя набор символов для процентого кодирования C0 и кодовые точки U+0020 SPACE, U+0022 ("), U+003C (<), U+003E (>), и U+0060 (`).
  • Набор символов для процентого кодирования пути включает в себя набор символов для процентого кодирования C0 и кодовые точки U+0020 SPACE, U+0022 ("), U+0023 (#), U+003C (<), U+003E (>), U+003F (?), U+0060 (`), U+007B ({), и U+007D (}).
  • Набор символов для кодирования информации пользователя включает в себя набор символов для процентого кодирования пути и кодовые точки U+002F (/), U+003A (😃, U+003B (😉, U+003D (=), U+0040 (@), U+005B ([) — U+005E(^), и U+007C (|).

Набор символов для процентого кодирования информации пользователя используется исключительно для имен пользователей и паролей, кодируемых в URL. Набор символов для процентого кодирования пути используется для пути большинства URL-адресов. Набор символов для процентого кодирования фрагмента используется для фрагментов URL. Набор символов для процентого кодирования C0 используется для хоста и пути при определенных условиях, а также во всех остальных случаях.

Когда не-ASCII символы появляются в имени хоста, имя хоста кодируется с использованием алгоритма Punycode. Однако следует отметить, что имя хоста может содержать как закодированные с помощью Punycode, так и закодированные с помощью процентного кодирования символы:

js
const myURL = new URL('https://%CF%80.example.com/foo')
console.log(myURL.href)
// Выведет https://xn--1xa.example.com/foo
console.log(myURL.origin)
// Выведет https://xn--1xa.example.com