ERR_HTTP_RESPONSE_CODE_FAILURE значит, что сервер ответил кодом ошибки — от 400 до 599 — и не прислал ни одного байта в теле ответа. Показывать посетителю нечего, поэтому Chrome выводит свой экран: «Страница недоступна», «Страница не найдена» или «Доступ запрещен», а под текстом строку «HTTP ERROR 500», «HTTP ERROR 404» и т. п. Сам код ERR_HTTP_RESPONSE_CODE_FAILURE на экране не пишется: его видно в консоли, в DevTools и в средствах автоматизации. Мы проверили на стенде Chromium 149 все коды от 400 до 599, разные варианты пустого ответа, PHP под Apache и Firefox.
Как определить причину за минуту
| Что на экране | Что случилось | Кто исправляет |
|---|---|---|
| HTTP ERROR 500, 502, 503 | сервер или скрипт упал и не вернул страницу | владелец сайта |
| HTTP ERROR 504 | сервер не дождался ответа от следующего звена | владелец сайта |
| HTTP ERROR 404, 410 | страницы нет, а своей страницы 404 сервер не отдал | владелец сайта; посетителю — проверить адрес |
| HTTP ERROR 403, 401 | доступа нет, страница с объяснением не отдана | владелец сайта или вход по паролю |
| HTTP ERROR 429 | слишком много запросов | подождать и обновить |
Если код из этого списка, ошибка на стороне сайта. Посетителю имеет смысл обновить страницу через пару минут, проверить адрес и, если не помогло, написать владельцу.
Что означает ошибка
В исходниках Chromium, в файле net_error_list.h, у ошибки код −379 и описание «The server returned a non-2xx HTTP response code» — сервер вернул код ответа не из группы 2xx. Там же оговорка: используется она только там, где браузер сам разбирает код ответа.
Когда именно её выдаёт обычная загрузка страницы, видно в файле http_error_navigation_throttle.cc. Условия такие:
- загружается сам документ вкладки, а не фрейм внутри неё;
- код ответа 400 или больше, и у браузера есть для него своя страница ошибки — в Chrome это любой код от 400 до 599 (localized_error.cc);
- тело ответа пустое — ноль байт.
Если все три условия выполнены, браузер отменяет загрузку с кодом ERR_HTTP_RESPONSE_CODE_FAILURE и показывает свою страницу ошибки. Если в теле есть хотя бы один байт, загрузка продолжается и посетитель видит то, что прислал сервер. Автоматическую перезагрузку, которую Chrome делает при сетевых ошибках, для этой ошибки код отключает (net_error_auto_reloader.cc): сервер ответил, и повтор сам по себе не поможет.
Стенд: какие коды дают ошибку
Мы подняли свой сервер на Node.js, который отдаёт любой код с пустым телом, и открыли адреса в Chromium 149 с русским интерфейсом.
| Код, пустое тело | Экран Chromium 149 |
|---|---|
| 400, 401, 405, 418, 429, 451, 499, 599 | «Страница недоступна. Если проблема не исчезнет, свяжитесь с владельцем сайта» |
| 403 | «Доступ к … запрещен. У вас нет прав для просмотра этой страницы» |
| 404 | «Страница … не найдена. Не найдена страница для веб-адреса …» |
| 410 | «Страница … не найдена. Возможно, он был перемещен или удален», без кнопки «Перезагрузить» |
| 500, 502, 503 | «Страница недоступна. Сайт … пока не может обработать этот запрос» |
| 504 | «Страница недоступна. Превышено время ожидания ответа от сайта …» |
| 600, 999 | пустая белая страница, ошибки нет |
| 200 | пустая белая страница |
| 204 | загрузка отменена, остаётся прежняя страница |
Во всех строках, кроме трёх последних, под текстом стоит «HTTP ERROR» и код, а Playwright получает net::ERR_HTTP_RESPONSE_CODE_FAILURE.
Стенд: что считается пустым ответом
| Ответ | Результат |
|---|---|
| 404, Content-Length: 0 | ERR_HTTP_RESPONSE_CODE_FAILURE |
| 404, chunked без данных | ERR_HTTP_RESPONSE_CODE_FAILURE |
| 404 без длины, соединение закрыто | ERR_HTTP_RESPONSE_CODE_FAILURE |
| 404, тело — один пробел | белая страница, ошибки нет |
| 404, тело — перевод строки | белая страница, ошибки нет |
| 404, тело «Not found» | текст «Not found» |
| iframe с пустой 404 | пустой фрейм, экрана ошибки нет |
| fetch к пустой 404 | ответ со статусом 404, ok = false, без исключения |
| отправка формы, ответ 500 без тела | экран «HTTP ERROR 500» |
Из этого следуют три вывода:
- Важен способ отдачи только в одном смысле: есть ли хоть один байт. Content-Length, chunked и закрытие соединения дают одинаковый результат.
- Один пробел меняет экран. Сервер, который на ошибку отдаёт пробел или перевод строки, показывает посетителю белый лист вместо понятного сообщения. Это хуже: на белом листе нет ни кода, ни кнопки.
- Ошибка только у документа вкладки. Пустая 404 во фрейме или в запросе скрипта не вызывает экран: фрейм остаётся пустым, а скрипт получает обычный ответ с кодом 404.
Стенд: PHP и Firefox
Самый частый реальный источник пустого ответа — PHP. Мы взяли образ с PHP 8.3.33 и Apache 2.4.68 и вызвали несуществующую функцию.
| Сервер | display_errors | Ответ | Chromium 149 |
|---|---|---|---|
| Apache + mod_php | Off | 500, 0 байт | HTTP ERROR 500 |
| встроенный сервер PHP | Off | 500, 0 байт | HTTP ERROR 500 |
| встроенный сервер PHP | On | 200, текст «Fatal error…» | текст ошибки на странице |
| http_response_code(404) без вывода | — | 404, 0 байт | HTTP ERROR 404 |
На боевом сервере вывод ошибок обычно выключен, и посетитель видит не текст ошибки, а экран HTTP ERROR 500. При включённом выводе код ответа остаётся 200 — для робота такая страница выглядит рабочей.
Firefox 151 на пустые ответы показывает свой экран «Looks like there's a problem with this site» и строку «The server at … sent back an error: 404 Not Found». В Playwright он возвращает NS_ERROR_NET_EMPTY_RESPONSE для 403 и 404 и NS_ERROR_NET_ERROR_RESPONSE для 500.
Почему возникает ERR_HTTP_RESPONSE_CODE_FAILURE
- Скрипт упал с фатальной ошибкой при выключенном выводе ошибок — так PHP на стенде отдал 500 без тела. Другие языки и фреймворки при падении ведут себя по-разному, многие отдают свою страницу 500.
- Код ответа задан, а страница не выведена. Например, http_response_code(404) и выход из скрипта, res.status(404).end() в Express, return с кодом без шаблона в любом фреймворке.
- Прокси или балансировщик вернул ошибку без страницы — 502, 503, 504, когда приложение за ним недоступно или отвечает слишком долго.
- Защита от ботов или ограничение частоты отдаёт 403 или 429 без текста.
- Своя страница ошибки не настроена или сама падает при выводе.
Как исправить ошибку посетителю
- Обновите страницу через пару минут. Коды 502, 503, 504 и 429 часто временные.
- Проверьте адрес, если на экране 404 или 410: опечатка, лишний символ, устаревшая ссылка.
- Откройте главную сайта. Если она работает, сломан один адрес; если нет — весь сайт.
- Войдите в аккаунт, если на экране 401 или 403 и раздел требует входа.
- Напишите владельцу сайта, если ошибка держится: приложите адрес, время и код с экрана.
Очистка кэша, смена DNS и отключение расширений здесь почти никогда не помогают: сервер уже ответил, ответ просто пустой.
Как исправить ошибку владельцу сайта
- Найдите исходную ошибку в журнале. Для 500 — журнал ошибок PHP или приложения, для 502 и 504 — журнал прокси (nginx, Apache) и состояние приложения за ним. Подробно по кодам — в статьях про ошибку 500, 502 и 503.
- Проверьте ответ вручную:
curl -i адрес. Если в выводе код 4xx или 5xx и Content-Length: 0 либо пустое тело, — это ваш случай. - Настройте страницы ошибок. В nginx — error_page, в Apache — ErrorDocument, во фреймворке — шаблон для 404 и 500. Страница должна отдаваться с тем же кодом ошибки, а не с 200.
- Не отдавайте пробел вместо страницы. Тело из пробела убирает экран HTTP ERROR, но посетитель видит белый лист.
- Не включайте вывод ошибок на боевом сайте, чтобы «увидеть текст». Посетитель получит код 200 и куски кода, а поисковик — рабочую страницу с мусором. Смотрите ошибки в журнале.
Проверьте, какой код и какой ответ получает поисковик на вашей странице. Движок разбирает одну страницу: код ответа, метатеги, заголовки, canonical, robots.txt. Без регистрации.
Влияет ли ошибка на SEO
Роботы Яндекса и Google не видят экран браузера. Для них важен код ответа: пустая 404 для робота такая же 404, как оформленная, и страница выпадет из индекса одинаково. Проблема в другом — за пустым ответом часто стоит сломанный скрипт:
- 5xx на важных страницах — робот снижает частоту обхода, а если ошибка держится, страницы уходят из индекса;
- 200 с текстом ошибки при включённом выводе — робот считает адрес рабочим и может проиндексировать текст «Fatal error»;
- 200 с пустой страницей — Google может посчитать её мягкой 404.
Как проверить коды на сайте целиком, разобрано в статье как проверить страницу 404.
Чем ERR_HTTP_RESPONSE_CODE_FAILURE отличается от похожих ошибок
| Ошибка | Что пришло от сервера |
|---|---|
| ERR_HTTP_RESPONSE_CODE_FAILURE | заголовки с кодом 4xx или 5xx, тела нет |
| ERR_EMPTY_RESPONSE | вообще ничего, даже заголовков |
| ERR_CONNECTION_RESET | соединение оборвано |
| ERR_TOO_MANY_REDIRECTS | бесконечные перенаправления |
| HTTP ERROR с текстом сайта | код ошибки и страница сайта — это не ошибка браузера |
Границы замера
- Chromium 149 и Firefox 151 на Linux, сборки из Playwright. Chrome на Windows и Яндекс Браузер мы не проверяли; Firefox — с английским интерфейсом.
- Ответы отдавал наш сервер по HTTP/1.1 на локальном адресе. Поведение по HTTP/2 и через CDN мы здесь не проверяли.
- PHP проверяли в одном образе с настройками по умолчанию. Ваш хостинг может выводить ошибки иначе.
Источники
- Chromium: net/base/net_error_list.h — github.com/chromium
- Chromium: content/browser/renderer_host/http_error_navigation_throttle.cc — github.com/chromium
- Chromium: components/error_page/common/localized_error.cc, components/error_page/content/browser/net_error_auto_reloader.cc — github.com/chromium
- RFC 9110 «HTTP Semantics», раздел 15 — rfc-editor.org
- Google Search Central: «How HTTP status codes, and network and DNS errors affect Google Search» — developers.google.com
Похожие ошибки
- Ошибка 500 — внутренняя ошибка сервера.
- Ошибка 418 — шуточный код, который на пустом ответе даёт тот же экран HTTP ERROR.
- ERR_EMPTY_RESPONSE — сервер закрыл соединение, ничего не ответив.
Коротко
- ERR_HTTP_RESPONSE_CODE_FAILURE — сервер ответил кодом 400–599 и пустым телом; Chrome показывает свой экран с «HTTP ERROR» и кодом.
- Ошибка на стороне сайта; посетителю — обновить позже, проверить адрес, написать владельцу.
- Один байт в теле убирает экран: пробел даёт белый лист, текст — текст.
- Частый источник — упавший PHP с выключенным выводом ошибок: 500 и пустой ответ.
- Роботы смотрят на код, а не на экран; лечить нужно причину 5xx и отдавать страницы ошибок с правильным кодом.
