Перейти к основному содержимому

2.04. Внутренние ошибки браузера

Всем

Внутренние ошибки браузера

Отличие ошибок клиента от HTTP-кода

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

image-2.png

Здесь нужно понять, что ошибки бывают двух видов:

  • ошибки с кодами HTTP (4XX/5XX);
  • внутренние ошибки браузера (ERR_...).

Такие ошибки сигнализируют о проблемах с загрузкой страниц, делясь на ошибки клиента (неверный адрес, нет интернета) и сервера (сбой, перегрузка). К примеру, 404 - не найдено, 403 - запрещено, 500 - внутренняя ошибка.

HTTP-ошибки возвращаются сервером. А вот внутренние ошибки браузера генерируются самим клиентским приложением, когда соединение с сервером не установлено, прервано или нарушено до получения HTTP-ответа. Да, можно делить именно так, что HTTP-ошибки на серверной части, а внутренние ошибки браузера на клиентской.

И если с кодами HTTP ещё ясно, то вот с ERR_ (к примеру, ERR_NAME_NOT_RESOLVED, когда браузер не может определить IP-адрес хоста) чуть сложнее. Такие ошибки не являются частью протокола HTTP и не зависят от серверной логики. Они возникают на уровне операционной системы, сетевого стека, TLS-библиотеки или самого браузерного движка.

Их мы и разберём.

Браузеры используют собственные системы идентификации сетевых сбоев, и каждая из них имеет свои особенности. Однако большинство современных браузеров (кроме Safari) основаны на одном из двух движков:

  • Chromium — Google Chrome, Microsoft Edge, Opera, Яндекс Браузер;
  • Gecko — Mozilla Firefox;
  • WebKit — Safari (на macOS и iOS).

Это определяет схожесть или различие в форматах ошибок.


1. Ошибки в браузерах на базе Chromium

Общая характеристика

Браузеры на базе Chromium (Chrome, Edge, Opera, Яндекс Браузер) используют общую систему ошибок, определённую в проекте Chromium как net::Error. Эти ошибки представлены в виде констант вида ERR_* и отображаются пользователю через понятные сообщения, но в инструментах разработчика (DevTools), логах или при программной обработке сохраняют свой оригинальный код.

Примечание: Яндекс Браузер, несмотря на собственные надстройки (Turbo-режим, защита и т.п.), полностью использует Chromium-ядро и потому идентичен Chrome в плане сетевых ошибок.

Формат ошибки

  • Код: net::ERR_CONNECTION_REFUSED
  • Сообщение пользователю: «Не удаётся подключиться к сайту»
  • Отображение в DevTools → Network: красная строка с кодом ошибки
  • Возможность перехвата в JavaScript: только через fetch().catch() или XMLHttpRequest.onerror, но без доступа к точному ERR_-коду

Основные категории ERR_-ошибок

1.1. DNS и разрешение имён

КодОписание
ERR_NAME_NOT_RESOLVEDНе удалось найти IP-адрес по доменному имени
ERR_DNS_TIMED_OUTПревышено время ожидания ответа DNS-сервера
ERR_DNS_CACHE_MISSВнутренняя ошибка кэша DNS (редко видима пользователю)
ERR_DNS_SEARCH_EMPTYНе удалось выполнить поиск хоста в локальных доменах

Причины:

  • Опечатка в адресе (gogle.com)
  • Неработающий DNS (например, при отключении интернета)
  • Блокировка домена провайдером или файрволом

Диагностика:

  • Команда nslookup example.com или dig example.com
  • Проверка файла hosts на наличие переопределений
  • Смена DNS на 8.8.8.8 (Google) или 1.1.1.1 (Cloudflare)

1.2. Установка TCP-соединения

КодОписание
ERR_CONNECTION_REFUSEDСервер активно отклонил соединение (порт закрыт)
ERR_CONNECTION_TIMED_OUTСервер не ответил в течение заданного времени
ERR_CONNECTION_RESETСоединение было неожиданно разорвано сервером
ERR_CONNECTION_CLOSEDСервер закрыл соединение без передачи данных
ERR_CONNECTION_ABORTEDСоединение прервано по инициативе клиента или ОС

Причины:

  • Веб-сервер не запущен (localhost:3000 при отсутствии dev-сервера)
  • Фаервол/антивирус блокирует порт
  • Сервер перегружен и не принимает новые соединения
  • NAT или прокси неправильно настроены

Диагностика:

  • telnet example.com 80 — проверка открытости порта
  • curl -v http://example.com — детальный вывод соединения
  • Логи сервера (Nginx, Apache, Node.js и др.)

1.3. SSL/TLS и безопасность

КодОписание
ERR_SSL_PROTOCOL_ERRORНарушена структура TLS-сессии (например, HTTP на HTTPS-порту)
ERR_CERT_AUTHORITY_INVALIDСертификат не подписан доверенным центром
ERR_CERT_DATE_INVALIDСрок действия сертификата истёк или ещё не начался
ERR_CERT_COMMON_NAME_INVALIDИмя в сертификате не совпадает с доменом
ERR_SSL_VERSION_OR_CIPHER_MISMATCHНет общих версий TLS или шифров между клиентом и сервером
ERR_SSL_PINNING_FAILUREНарушена политика Certificate Pinning (в enterprise-средах)

Причины:

  • Самоподписанный сертификат на локальном сервере
  • Устаревший сертификат Let’s Encrypt
  • Неправильная настройка reverse proxy (например, Nginx без ssl_certificate)
  • Атака MITM или корпоративный прокси с вставкой своего сертификата

Диагностика:

  • Проверка сертификата через openssl s_client -connect example.com:443
  • Использование SSL Labs Test
  • Временное отключение проверки в dev-среде (только для разработки!)

1.4. Прокси и сеть

КодОписание
ERR_PROXY_CONNECTION_FAILEDНе удалось подключиться к прокси-серверу
ERR_TUNNEL_CONNECTION_FAILEDОшибка при установке HTTPS-туннеля через прокси
ERR_INTERNET_DISCONNECTEDОС сообщает, что нет подключения к интернету
ERR_NETWORK_CHANGEDСетевой интерфейс изменился (Wi-Fi → Ethernet и т.п.)

Причины:

  • Неверные настройки прокси в системе или браузере
  • Корпоративный прокси требует аутентификации
  • Роутер перезагрузился во время загрузки страницы

Диагностика:

  • Проверка настроек сети в ОС
  • Отключение прокси вручную
  • Использование режима инкогнито (часто игнорирует системные прокси)

1.5. Прочие ошибки

КодОписание
ERR_EMPTY_RESPONSEСервер принял соединение, но не отправил ни одного байта
ERR_TOO_MANY_REDIRECTSБесконечная цепочка редиректов (301/302)
ERR_BLOCKED_BY_CLIENTЗапрос заблокирован расширением (AdBlock, uBlock и др.)
ERR_ABORTEDЗапрос отменён (пользователь покинул страницу, скрипт вызвал .abort())
ERR_FILE_NOT_FOUNDЛокальный файл (file://) не существует
ERR_ACCESS_DENIEDДоступ к ресурсу запрещён (например, к file:///C:/Windows/)

Особенности Яндекс Браузера

Яндекс Браузер не вводит новых ERR_-кодов, но может:

  • Маскировать некоторые ошибки под собственные сообщения (например, «Страница заблокирована» вместо ERR_CONNECTION_REFUSED)
  • Добавлять предупреждения о фишинге или вредоносном контенте поверх стандартных ошибок
  • В Turbo-режиме перехватывать запросы и показывать ERR_PROXY_CONNECTION_FAILED, если прокси Яндекса недоступен

Рекомендуется отключать Turbo-режим при отладке.


2. Ошибки в Mozilla Firefox (движок Gecko)

Общая характеристика

Firefox использует собственную систему ошибок, основанную на кодах NS_ERROR_* и SEC_ERROR_*. Эти коды происходят из внутренней архитектуры Mozilla (XPCOM, NSS).

Они не совпадают с ERR_-кодами Chromium, но описывают те же классы проблем.

Формат ошибки

  • Код: NS_ERROR_CONNECTION_REFUSED
  • Сообщение: «Firefox не может установить соединение с сервером»
  • В DevTools → Network: отображается как (failed) с кодом в консоли
  • В about:networking или about:config — можно включить расширенную диагностику

Основные категории

2.1. Сетевые ошибки (NS_ERROR_*)

КодОписание
NS_ERROR_UNKNOWN_HOSTАналог ERR_NAME_NOT_RESOLVED
NS_ERROR_CONNECTION_REFUSEDСервер отклонил соединение
NS_ERROR_NET_TIMEOUTТаймаут соединения
NS_ERROR_NET_RESETСоединение сброшено
NS_ERROR_OFFLINEРежим «Работать автономно» включён
NS_ERROR_PROXY_CONNECTION_REFUSEDПрокси недоступен

2.2. Ошибки безопасности (SEC_ERROR_*, SSL_ERROR_*)

КодОписание
SEC_ERROR_UNKNOWN_ISSUERНеизвестный центр сертификации
SEC_ERROR_EXPIRED_CERTIFICATEПросроченный сертификат
SSL_ERROR_BAD_CERT_DOMAINНесоответствие домена
SSL_ERROR_RX_RECORD_TOO_LONGПолучен HTTP-ответ вместо TLS (аналог ERR_SSL_PROTOCOL_ERROR)

Особенности Firefox

  • Firefox более строг к сертификатам, чем Chromium
  • Поддерживает Enterprise Roots — корпоративные CA можно добавить через политики
  • В about:config можно временно отключить проверку (security.enterprise_roots.enabled, network.dns.disableIPv6 и др.)

3. Ошибки в Safari (движок WebKit)

Общая характеристика

Safari — единственный из крупных браузеров, использующий движок WebKit (а не Chromium или Gecko). Его система ошибок отличается от других: она менее детализирована, часто не показывает технические коды пользователю, и многие сбои маскируются под общие сообщения вроде «Safari не может открыть страницу».

Тем не менее, внутри WebKit существуют собственные коды ошибок, которые можно увидеть:

  • В консоли разработчика (DevTools → Console)
  • В системных логах macOS (Console.app)
  • При программной обработке через JavaScript или URLSession (в нативных приложениях)

В веб-контексте Safari редко раскрывает точные коды, но поведение при ошибках соответствует стандартным сетевым проблемам.

Формат ошибки

  • Пользовательское сообщение: «Safari cannot open the page because the server cannot be found»
  • В консоли: (failed) или Fetch API cannot load ... due to access control checks
  • Технический код (внутри): kCFErrorDomainCFNetwork + числовой код (например, -1003 для DNS-ошибки)

Основные категории ошибок (по числовым кодам CFNetwork)

Apple использует CFNetwork Error Codes — набор целочисленных значений из фреймворка Core Foundation. Наиболее частые:

Числовой кодЭквивалент ChromiumОписание
-1000ERR_INTERNET_DISCONNECTEDНе удалось установить соединение
-1001ERR_CONNECTION_TIMED_OUTТаймаут запроса
-1002Неподдерживаемый URL-схема (например, ftp:// без поддержки)
-1003ERR_NAME_NOT_RESOLVEDНе удалось найти хост
-1004ERR_CONNECTION_REFUSEDСоединение отклонено
-1005ERR_CONNECTION_CLOSEDСоединение закрыто сервером
-1006ERR_CONNECTION_RESETСоединение сброшено
-1200-1209ERR_SSL_*Ошибки SSL/TLS (сертификат, протокол, шифр)

Примечание: Safari строже всех применяет политику App Transport Security (ATS) на iOS/macOS. Даже если сертификат валиден, но не соответствует требованиям ATS (например, SHA-1 или TLS 1.0), соединение будет заблокировано с кодом -1200.

Особенности Safari

  • Нет поддержки некоторых современных TLS-шифров по умолчанию
  • Блокирует смешанный контент (HTTP на HTTPS-странице) без возможности обхода
  • Не показывает ERR_-коды — только общие фразы
  • Кэширует DNS агрессивно, особенно на iOS
  • Ограничивает фоновые запросы в мобильной версии (часто приводит к таймаутам)

Диагностика в Safari

  • Использовать Develop → Show Web Inspector
  • Проверить вкладку Network на наличие красных записей
  • Включить Console — там могут быть CORS-ошибки или блокировки безопасности
  • На macOS: открыть Console.app → фильтр по «Safari» или «CFNetwork»