Проверка доменных имен

Доменные имена в веб-разработке представляют собой структурированные строки, которые подчиняются строгим правилам синтаксиса: наличие допустимых символов, корректное разделение на уровни, соблюдение ограничений длины и корректность доменной зоны верхнего уровня. В Validator.js для таких проверок используется функциональность, связанная с анализом FQDN (Fully Qualified Domain Name).

Основным инструментом для проверки доменных имён в Validator.js является метод isFQDN. Он предназначен для определения, соответствует ли строка формату полностью квалифицированного доменного имени.

import validator from 'validator';

validator.isFQDN('example.com');

Результат проверки возвращает булево значение. При корректном домене функция вернёт true, при нарушении правил — false.

FQDN рассматривается как цепочка меток, разделённых точками. Каждая метка должна соответствовать набору требований: допустимые символы, отсутствие запрещённых комбинаций и корректная длина.

Структура доменного имени и ограничения

Доменные имена состоят из нескольких уровней:

  • поддоменов (например, api)
  • основного домена (например, example)
  • домена верхнего уровня (например, com)

Пример:

api.service.example.com

При проверке Validator.js анализирует:

  • допустимость символов (латиница, цифры, дефис)
  • отсутствие недопустимых символов (например, _ по умолчанию запрещён)
  • корректное расположение дефисов (не в начале и не в конце метки)
  • длину каждой метки (не более 63 символов)
  • общую длину домена (не более 253 символов)

Основные параметры isFQDN

Метод isFQDN поддерживает набор опций, которые позволяют адаптировать проверку под разные сценарии.

require_tld

Определяет, обязателен ли домен верхнего уровня.

validator.isFQDN('localhost', { require_tld: false });

Если параметр установлен в true, строки без зоны (example) будут считаться некорректными.

allow_underscores

Разрешает использование символа подчёркивания.

validator.isFQDN('my_service.example.com', { allow_underscores: true });

По умолчанию подчёркивания запрещены, так как они не соответствуют стандарту DNS, но в некоторых внутренних сетях и legacy-системах они встречаются.

allow_numeric_tld

Позволяет использовать числовые домены верхнего уровня.

validator.isFQDN('example.123', { allow_numeric_tld: true });

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

allow_trailing_dot

Разрешает завершающую точку в домене.

validator.isFQDN('example.com.', { allow_trailing_dot: true });

Точка в конце доменного имени иногда используется в DNS-контексте для обозначения абсолютного доменного имени.

Валидация международных доменов (IDN)

Validator.js поддерживает проверку интернационализированных доменных имён, содержащих символы Unicode. Такие домены преобразуются в Punycode перед проверкой.

Пример:

validator.isFQDN('пример.рф');

Внутренне строка будет приведена к виду:

xn--e1afmkfd.xn--p1ai

Это позволяет унифицировать проверку и работать с международными доменными зонами без нарушения стандартов DNS.

Типичные ошибки при проверке доменов

При использовании isFQDN часто встречаются ошибки, связанные с неправильным пониманием структуры домена.

Использование недопустимых символов

validator.isFQDN('exa$mple.com'); // false

Символ $ не входит в допустимый набор.

Неправильное расположение дефиса

validator.isFQDN('-example.com'); // false
validator.isFQDN('example-.com'); // false

Дефис не может находиться в начале или конце метки.

Двойные точки

validator.isFQDN('example..com'); // false

Пустая метка между точками нарушает структуру FQDN.

Отличие isFQDN от isURL

Хотя isFQDN проверяет только доменное имя, isURL охватывает более широкий контекст, включая протокол, путь, параметры и порт.

validator.isURL('https://example.com/path');
validator.isFQDN('example.com');

Использование isFQDN предпочтительно, когда требуется проверка именно доменной части без учёта URL-структуры.

Комбинирование проверок

В реальных приложениях проверка домена часто комбинируется с другими методами Validator.js:

validator.isFQDN(domain) && validator.isLength(domain, { max: 253 });

или в составе валидации URL:

validator.isURL(url, {
  require_host: true,
  host_whitelist: null
});

Особенности применения в серверной логике

Проверка доменных имён используется в различных сценариях:

  • регистрация пользовательских поддоменов
  • настройка DNS-записей
  • валидация конфигураций серверов
  • фильтрация входящих запросов по Host заголовку
  • проверка email-доменов в составе адресов

В серверной логике важно учитывать, что isFQDN не выполняет DNS-резолвинг, а лишь проверяет синтаксическую корректность строки.

Производственные нюансы

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

Также важно учитывать различие между:

  • синтаксической корректностью (Validator.js)
  • фактическим существованием домена (DNS lookup)

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

Обработка пограничных случаев

Некоторые домены формально могут проходить проверку, но вызывать проблемы в реальных системах:

  • очень длинные поддомены
  • нестандартные TLD в тестовых окружениях
  • локальные имена (localhost, localdomain)

Для таких случаев используются дополнительные настройки require_tld: false или кастомные whitelist-списки.

validator.isFQDN('localhost', {
  require_tld: false
});

Использование валидации в цепочках данных

При обработке пользовательского ввода домен часто является частью более сложных структур:

  • email (user@example.com)
  • URL (https://example.com)
  • конфигурационные файлы
  • API-запросы

Validator.js позволяет разделять ответственность: сначала извлекается доменная часть, затем применяется isFQDN, после чего результат комбинируется с другими проверками (например, isEmail, isURL, isIP).

Такой подход снижает вероятность ошибок и делает систему валидации более предсказуемой.