Методы isFQDN и isDomain

Базовая роль доменной валидации

Работа с доменными именами в веб-приложениях требует строгой проверки входных данных. Библиотека Validator.js предоставляет набор методов, ориентированных на синтаксическую и семантическую валидацию строк, представляющих домены и FQDN (Fully Qualified Domain Name).

Два ключевых метода в этой области — isDomain и isFQDN. Несмотря на схожесть задач, они решают разные уровни проверки:

  • isDomain — проверка корректности доменного имени как структуры (без обязательного требования к полному доменному имени)
  • isFQDN — проверка полностью квалифицированного доменного имени с учётом всех DNS-ограничений

isDomain

Назначение метода

Метод isDomain используется для проверки строк, которые потенциально являются доменными именами. Основной фокус — синтаксическая корректность структуры: допустимые символы, разделение точками, длина меток.

Метод не гарантирует существование домена в DNS, а проверяет только соответствие формальным правилам.


Сигнатура

isDomain(str [, options])
  • str — строка для проверки
  • options — объект конфигурации (необязательный)

Основные правила проверки

Метод учитывает следующие ограничения:

  • Домен состоит из меток, разделённых точками
  • Каждая метка может содержать буквы, цифры и дефисы
  • Дефис не допускается в начале и конце метки
  • Общая длина домена ограничена стандартами DNS
  • Поддерживаются Unicode-домены (в зависимости от конфигурации)

Поддерживаемые опции

Validator.js позволяет тонко настраивать поведение проверки:

require_tld

{ require_tld: true }

Если включено, домен обязан содержать TLD (например, .com, .org).

Примеры:

  • example → невалиден
  • example.com → валиден

allow_underscores

{ allow_underscores: true }

Разрешает символ _ в метках домена.

Используется в legacy-системах:

  • my_domain.example.com → валиден при включённой опции

allow_trailing_dot

{ allow_trailing_dot: true }

Разрешает завершающую точку, характерную для FQDN в DNS-записях:

  • example.com. → валиден

allow_numeric_tld

{ allow_numeric_tld: true }

Позволяет числовые TLD, хотя в реальном DNS это редкий и спорный случай:

  • example.123 → валиден при включении

Примеры использования

validator.isDomain('example.com'); // true
validator.isDomain('sub.example.com'); // true
validator.isDomain('-example.com'); // false
validator.isDomain('example'); // true или false (зависит от require_tld)

С опциями:

validator.isDomain('example', { require_tld: true }); // false
validator.isDomain('example', { require_tld: false }); // true
validator.isDomain('my_domain.com', { allow_underscores: true }); // true

Ограничения isDomain

Метод не проверяет:

  • существование домена в DNS
  • корректность DNS-записей
  • соответствие RFC на уровне всех исключений
  • IP-адреса (для этого используются другие методы)

isFQDN

Назначение метода

Метод isFQDN предназначен для проверки полностью квалифицированных доменных имён. Это более строгая проверка по сравнению с isDomain.

FQDN подразумевает:

  • полную иерархию домена
  • корректный корневой домен
  • строгие правила для TLD

Сигнатура

isFQDN(str [, options])
  • str — проверяемая строка
  • options — объект настроек

Основные правила FQDN

Метод учитывает следующие требования:

  • домен состоит минимум из двух уровней (при включённом require_tld)
  • каждая метка соответствует DNS-правилам
  • TLD должен быть валидным
  • запрещены некорректные символы
  • контроль длины каждой части домена

Ключевые опции

require_tld

{ require_tld: true }

Обязывает наличие зоны верхнего уровня.

Примеры:

  • example.com → валиден
  • localhost → невалиден

allow_underscores

{ allow_underscores: true }

Разрешает символ _:

  • my_host.example.com → валиден

allow_trailing_dot

{ allow_trailing_dot: true }

Поддержка полного DNS-формата:

  • example.com. → валиден

allow_numeric_tld

{ allow_numeric_tld: true }

Разрешает числовые TLD:

  • example.123 → валиден при включении

allow_wildcard

{ allow_wildcard: true }

Поддержка wildcard-доменов:

  • *.example.com → валиден

Используется в сертификатах TLS и конфигурациях серверов.


Примеры использования

validator.isFQDN('example.com'); // true
validator.isFQDN('sub.example.com'); // true
validator.isFQDN('example'); // false (по умолчанию)
validator.isFQDN('example.com.'); // true (с allow_trailing_dot)

С расширенными настройками:

validator.isFQDN('*.example.com', { allow_wildcard: true }); // true
validator.isFQDN('my_host.example.com', { allow_underscores: true }); // true

Сравнение isDomain и isFQDN

Уровень строгости

  • isDomain — более мягкая проверка структуры
  • isFQDN — строгая проверка полного доменного имени

Требование к TLD

  • isDomain: может быть отключено (require_tld: false)
  • isFQDN: часто предполагает наличие TLD

Поддержка wildcard

  • isDomain: отсутствует
  • isFQDN: поддерживается через allow_wildcard

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

isDomain применяется в:

  • формах ввода пользовательских доменов
  • настройках конфигураций
  • предварительной валидации

isFQDN применяется в:

  • DNS-конфигурациях
  • SSL/TLS сертификатах
  • системах маршрутизации
  • инфраструктуре серверов

Особенности обработки Unicode и IDN

Оба метода могут работать с интернационализированными доменами (IDN), но поведение зависит от окружения и версии Validator.js.

Примеры:

  • пример.рф
  • münchen.de

При необходимости используется Punycode-представление:

  • xn--e1afmkfd.xn--p1ai

Частые ошибки при использовании

Ошибка: путаница между доменом и URL

Методы не предназначены для проверки URL:

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

Ошибка: игнорирование require_tld

Без явного указания опций возможны неожиданные результаты:

validator.isDomain('localhost'); // может вернуть true

Ошибка: ожидание DNS-валидности

Методы не выполняют сетевую проверку:

validator.isFQDN('nonexistent.example.com'); // может вернуть true

Практические сценарии применения

Валидация пользовательских доменов

if (validator.isDomain(input, { require_tld: true })) {
  // принятие домена
}

Проверка конфигурации сервера

if (validator.isFQDN(hostname, { allow_wildcard: true })) {
  // использование в TLS или routing
}

Фильтрация входных данных API

const valid = validator.isFQDN(domain, {
  require_tld: true,
  allow_underscores: false
});

Поведение при граничных значениях

Длина домена

DNS ограничивает:

  • каждую метку до 63 символов
  • полный домен до 253 символов

Validator.js учитывает эти ограничения при строгих режимах.


Символы в метках

Разрешены:

  • a–z
  • 0–9
  • дефис (-)

Запрещены:

  • пробелы
  • специальные символы (@, #, %)
  • двойные точки

Начало и конец меток

Недопустимо:

  • -example.com
  • example-.com

Поведение при комбинации опций

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

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

В этом случае:

  • разрешены подчёркивания
  • обязателен TLD
  • допускается завершающая точка

Взаимодействие с другими методами Validator.js

Методы часто комбинируются:

  • isURL — для проверки URL целиком
  • isIP — для IP-адресов вместо доменов
  • normalizeEmail — в связке с доменными частями email

Пример:

validator.isEmail(email) && validator.isFQDN(domain);

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

Если передано не строковое значение:

  • происходит приведение к строке
  • либо возвращается false (в зависимости от версии и метода вызова)

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

  • null
  • undefined
  • числа
  • объекты

Внутренние принципы валидации

Validator.js использует:

  • регулярные выражения для базовой проверки
  • постобработку строк (split по точкам)
  • проверку каждой DNS-метки отдельно
  • опциональные флаги, влияющие на regex-ветки

Поведение в реальных инфраструктурах

Web-приложения

  • проверка домена перед привязкой аккаунта
  • фильтрация пользовательских настроек

DevOps

  • валидация конфигураций nginx/apache
  • проверка доменов в CI/CD пайплайнах

Почтовые системы

  • проверка доменной части email-адресов
  • фильтрация SMTP-данных