← Cloudflare Fundamentals / fundamentals / reference
Ответы с ошибками
Когда Cloudflare не может выполнить запрос, она формирует ответ с ошибкой. Формат зависит от того, что запрашивает клиент через Accept заголовке, а также в настройках зоны Custom Errors конфигурации.
По умолчанию ответы об ошибках возвращаются в формате HTML. Клиенты, запрашивающие структурированный формат (например, application/json, application/problem+json, или text/markdown) получают вместо этого машиночитаемый ответ. Этот машиночитаемый ответ охватывает все Коды ошибок 1xxx (которые возвращают коды состояния HTTP 4xx или 5xx в зависимости от ошибки) и созданные Cloudflare Ошибки 5xx (500, 502, 504, 520-526). Ответы с ошибками 5xx, которые генерирует исходный сервер, Cloudflare передаёт клиенту без изменений.
Согласование содержимого
Cloudflare выбирает формат ответа на основе клиентского Accept заголовок, следуя стандартным Согласование содержимого HTTP ↗. Если допустимо несколько форматов, используются коэффициенты качества (q значений) определяют приоритет. При одинаковом значении качества побеждает тип, указанный первым в списке.
Accept отправленный заголовок |
Формат ответа |
|---|---|
application/json |
JSON (application/json; charset=utf-8) |
application/problem+json |
JSON (application/problem+json; charset=utf-8) |
application/json, text/markdown;q=0.9 |
JSON (более высокий коэффициент качества) |
text/markdown |
Markdown (text/markdown; charset=utf-8) |
text/markdown, application/json |
Markdown (равное качество, побеждает первый в списке) |
text/* |
Markdown |
text/html |
HTML |
*/* |
HTML |
| Не задано | HTML |
Структурированные ответы об ошибках доступны на всех тарифных планах, включая план Free. Custom Error Rules для переопределения этих ответов требуют платного тарифного плана Cloudflare.
Взаимодействие с Custom Errors
Структурированные ответы об ошибках используются по умолчанию для зон без пользовательской настройки ошибок. Зоны, которые используют Custom Errors сохраняют полный контроль над тем, что получают клиенты.
То, что получает клиент, зависит от того, какие функции настраиваемых ошибок включены в вашей зоне. Подробности приведены в следующих разделах.
Нет пользовательской страницы ошибок, нет пользовательских правил ошибок
Это значение по умолчанию для большинства зон. Cloudflare отдаёт свой стандартный ответ об ошибке в формате, который запрашивает клиент.
| Клиент отправляет | Ответ |
|---|---|
Accept: application/json |
Стандартный структурированный JSON-ответ Cloudflare |
Accept: text/markdown |
Стандартный структурированный Markdown-ответ Cloudflare |
Accept: text/html |
Стандартная HTML-страница ошибки Cloudflare |
Нет Accept заголовок |
Стандартная HTML-страница ошибки Cloudflare |
Настроена страница ошибки, пользовательские правила ошибок отсутствуют
В зоне загружена Error Page через дашборд Cloudflare. Пользовательские правила ошибок (Custom Error Rules) не настроены. Error Page отображается всем клиентам независимо от Accept заголовок. Error Pages не выполняют согласование содержимого.
| Клиент отправляет | Ответ |
|---|---|
Accept: application/json |
Ваша пользовательская страница ошибки HTML |
Accept: text/markdown |
Ваша пользовательская страница ошибки HTML |
Accept: text/html |
Ваша пользовательская страница ошибки HTML |
Нет Accept заголовок |
Ваша пользовательская страница ошибки HTML |
Если вы хотите, чтобы агенты получали структурированные ответы, сохранив при этом собственный HTML для браузеров, добавьте Custom Error Rule, соответствующее Accept заголовок. Подробности см. в следующем разделе.
Настроенные Custom Error Rules
В зоне есть одно или несколько Custom Error Rules (доступно на платных тарифных планах). Они имеют приоритет над Error Pages. Вы сами определяете, что показывать, кому и при каких условиях.
| Клиент отправляет | Ответ |
|---|---|
Accept: application/json |
Если срабатывает Custom Error Rule, отдаётся содержимое этого правила. Если ни одно правило не сработало, используется Error Page (если настроена) или структурированный JSON-ответ. |
Accept: text/markdown |
Если срабатывает Custom Error Rule, отдаётся содержимое этого правила. Если ни одно правило не сработало, используется Error Page (если настроена) или структурированный Markdown-ответ. |
Accept: text/html |
Если срабатывает Custom Error Rule, отдаётся содержимое этого правила. Если ни одно правило не сработало, используется Error Page или HTML по умолчанию. |
Нет Accept заголовок |
Та же резервная цепочка |
Custom Error Rules могут применяться к любому заголовку запроса, включая Accept, и может ориентироваться на конкретные коды ошибок. В рамках одной и той же зоны вы можете отдавать JSON API-клиентам, Markdown агентам и HTML браузерам.
Пример: отдавать собственный JSON клиентам API при ошибке 522
Это пользовательское правило ошибок (Custom Error Rule) соответствует ошибкам 522, когда клиент запрашивает JSON:
Выражение: (http.response.code eq 522) and (any(http.request.headers["accept"][*] contains "application/json"))
Действие: Предоставьте собственный JSON-ответ в своём формате ошибки.
Это правило имеет приоритет как над стандартным структурированным JSON-ответом, так и над любой настроенной Error Page. Клиенты, которые не соответствуют правилу (например, браузеры, запрашивающие HTML), переходят к Error Page или к стандартному ответу Cloudflare.
Пример: отдавать структурированные ответы агентам и собственную HTML-страницу браузерам
Если в вашей зоне настроена Error Page, она отдаётся всем клиентам, включая агентов, запрашивающих JSON или Markdown. Чтобы агенты вместо этого получали стандартные структурированные ответы Cloudflare, удалите Error Page. Без Error Page Cloudflare учитывает Accept заголовок автоматически: агенты получают структурированный JSON или Markdown, а браузеры получают HTML.
Если вам нужно сохранить Error Page для браузеров, но при этом отдавать агентам собственный структурированный контент, создайте Custom Error Rules, соответствующие Accept заголовок и предоставлять собственный контент в формате JSON или Markdown. Браузеры, которые не соответствуют ни одному из правил, продолжают получать вашу пользовательскую HTML-страницу ошибки.
Порядок приоритета
Когда Cloudflare формирует ответ с ошибкой, то, что получит клиент, определяется следующим порядком приоритета:
- Custom Error Rules : Если правило соответствует условиям ошибки и запроса, отдаётся содержимое этого правила.
- Error Pages : Если для данного типа ошибки настроена Error Page и ни одно Custom Error Rule не совпало, Error Page отдаётся в формате HTML независимо от
Acceptзаголовок. - Структурированные ответы об ошибках : Если ни одно Custom Error Rule не совпало и Error Page не настроена, Cloudflare отдаёт ответ по умолчанию в формате, запрошенном клиентом (JSON, Markdown или HTML).
Полный порядок приоритета, включая соотношение правил уровня аккаунта и уровня зоны, пользовательские блокирующие ответы WAF и страницы проверки безопасности, см. в Custom Errors документация.
Примеры
JSON: 522 Connection timed out
{
"type": "https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-5xx-errors/error-522/",
"title": "Error 522: Connection timed out",
"status": 522,
"detail": "Cloudflare could not establish a TCP connection to the origin server. The TCP handshake timed out, which may indicate the origin is overloaded, firewalling Cloudflare, or unreachable at the network level.",
"instance": "9f140b785e57c458",
"error_code": 522,
"error_name": "connection_timeout",
"error_category": "origin",
"ray_id": "9f140b785e57c458",
"timestamp": "2026-04-24T09:22:40Z",
"zone": "example.com",
"cloudflare_error": true,
"retryable": true,
"retry_after": 120,
"owner_action_required": true,
"what_you_should_do": "**Wait and retry.** Back off for at least 120 seconds. If the error persists, the website operator should verify firewall rules and ensure the origin accepts connections from Cloudflare IP ranges.",
"footer": "This error was generated by Cloudflare on behalf of the website owner."
}Markdown: 522 Connection timed out
---
error_code: 522
error_name: connection_timeout
error_category: origin
status: 522
ray_id: 9f140b785e57c458
timestamp: 2026-04-24T09:22:40Z
zone: example.com
cloudflare_error: true
retryable: true
retry_after: 120
owner_action_required: true
---
# Error 522: Connection timed out
## What Happened
Cloudflare could not establish a TCP connection to the origin server. The TCP handshake timed out, which may indicate the origin is overloaded, firewalling Cloudflare, or unreachable at the network level.
## What You Should Do
**Wait and retry.** Back off for at least 120 seconds. If the error persists, the website operator should verify firewall rules and ensure the origin accepts connections from Cloudflare IP ranges.
---
This error was generated by Cloudflare on behalf of the website owner.Тестирование структурированных ответов об ошибках
Получите структурированный JSON-ответ для ошибки 522:
curl --silent --compressed --header "Accept: application/json" \
--user-agent "TestAgent/1.0" --header "Accept-Encoding: gzip, deflate" \
"https://example.com/cdn-cgi/error/522" | jq .Получите структурированный Markdown-ответ:
curl --silent --compressed --header "Accept: text/markdown" \
--user-agent "TestAgent/1.0" --header "Accept-Encoding: gzip, deflate" \
"https://example.com/cdn-cgi/error/522"Проверьте наличие Retry-After заголовок при повторяемой ошибке:
curl --silent --compressed --dump-header - --output /dev/null \
--header "Accept: application/json" --user-agent "TestAgent/1.0" \
--header "Accept-Encoding: gzip, deflate" \
"https://example.com/cdn-cgi/error/521" | grep -i retry-afterПоля ответа
Ответы в форматах JSON и Markdown содержат один и тот же набор полей. В ответах JSON поля возвращаются в виде плоского объекта, а в ответах Markdown они располагаются во frontmatter YAML, за которым следуют текстовые разделы. Приведённые ниже описания полей относятся к обоим форматам.
Ответы в формате JSON соответствуют RFC 9457 (Problem Details for HTTP APIs) ↗. Любой HTTP клиент, поддерживающий Problem Details, может разобрать пять стандартных полей (type, title, status, detail, instance) без специфичного для Cloudflare кода.
Участники стандарта RFC 9457
| Поле | Тип | Описание |
|---|---|---|
type |
string | URI, указывающий на документацию Cloudflare по этому коду ошибки. |
title |
string | Краткое описание, например, "Error 522: Connection timed out". |
status |
целое число | Код состояния HTTP-ответа. |
detail |
string | Текстовое объяснение того, что пошло не так и какая сторона несёт ответственность. |
instance |
string | Ray ID, идентифицирующий данный конкретный случай ошибки. |
Участники расширения Cloudflare
| Поле | Тип | Описание |
|---|---|---|
error_code |
целое число | Код ошибки Cloudflare (например, 522, 1015). |
error_name |
string | Машиночитаемое имя в snake_case (например, connection_timeout, rate_limited). Стабильно: подходит для программного сопоставления. |
error_category |
string | Классификация сбоев. См. Категории ошибок. Стабильное значение: подходит для программного сопоставления. |
ray_id |
string | То же значение, что и instance. Включено для совместимости с существующими инструментами Cloudflare. |
timestamp |
string | Отметка времени в формате ISO 8601, когда была сгенерирована ошибка. |
zone |
string | Запрошенное имя хоста. |
cloudflare_error |
boolean | Всегда true. Подтверждает, что ошибка была сгенерирована Cloudflare, а не исходным сервером. |
retryable |
boolean | Является ли ошибка временной и можно ли повторить запрос. |
retry_after |
integer or null | Количество секунд ожидания перед повторной попыткой. Указывается только если retryable это true. Соответствует Retry-After значение HTTP-заголовка. |
owner_action_required |
boolean | Требуются ли от владельца сайта действия для устранения ошибки. |
what_you_should_do |
string | Практические рекомендации для клиента: что делать дальше, стоит ли повторить попытку и кто может устранить проблему. |
footer |
string | Строка атрибуции. |
Структура, специфичная для Markdown
Ответы в формате Markdown размещают эти поля в YAML frontmatter (между --- разделители), а затем три текстовых раздела:
# Error {code}: {description}: заголовок с кодом ошибки и кратким описанием.## What Happened: соответствуетdetailполе.## What You Should Do: соответствуетwhat_you_should_doполе.
Frontmatter не включает стандартные поля RFC 9457 (type, title, instance) и footer поле, поскольку они либо дублируют текстовое описание, либо неприменимы к формату Markdown.
Категории ошибок
error_category поле классифицирует ошибку, чтобы клиенты могли определять поведение при повторных попытках и эскалации, не разбирая текстовые поля.
Категории кодов ошибок 5xx
| Категория | Коды | Значение | Повторить? |
|---|---|---|---|
origin |
502, 504, 520-524 | Проблема на стороне исходного сервера. Временный сбой инфраструктуры. | Да. Используйте задержку с помощью retry_after. |
cloudflare |
500 | Cloudflare столкнулся с внутренней ошибкой. Исходный сервер не обязательно был к этому причастен. | Да. Короткая повторная попытка (30 с). |
ssl |
525, 526 | Конфигурация TLS исходного сервера повреждена (сбой TLS-рукопожатия или недействительный сертификат). | Нет. Повторная попытка не поможет, пока оператор не исправит конфигурацию TLS. |
Категории кодов ошибок 1xxx
| Категория | Значение | Примеры кодов |
|---|---|---|
access_denied |
Блокировка IP-адресов, блокировка стран, правила файрвола | 1005, 1006, 1007, 1008, 1010, 1012, 1106-1109 |
rate_limit |
Ограничение скорости запросов | 1015, 1025, 1027, 1200 |
dns |
Ошибки разрешения DNS | 1001, 1016 |
config |
Ошибки конфигурации зоны или источника | 1004, 1014, 1033, 1043, 1047, 1049 |
tls |
Ошибки TLS на стороне клиента (версия, шифр, сертификат) | 1017, 1028, 1029, 1044 |
legal |
Юридические ограничения (DMCA, блокировки по странам) | 1026, 1039 |
worker |
Ошибки скрипта Worker | 1042, 1100, 1101, 1102, 1103, 1104, 1105 |
rewrite |
Ошибки правил перезаписи URL | 1036, 1037 |
snippet |
Ошибки конфигурации Snippets | 1201, 1202, 1203, 1204, 1205, 1206 |
unsupported |
Неподдерживаемые функции или протоколы | 1045 |
Заголовок Retry-After
К повторяемым кодам ошибок относится стандартный Retry-After ↗ заголовка HTTP-ответа. Значение заголовка в секундах совпадает со значением retry_after поле в теле ответа.
Значения Retry-After для кодов 5xx
| Код | retry_after (в секундах) |
|---|---|
| 500 | 30 |
| 502 | 60 |
| 504 | 120 |
| 520 | 60 |
| 521 | 120 |
| 522 | 120 |
| 523 | 120 |
| 524 | 120 |
| 525 | N/A (not retryable) |
| 526 | N/A (not retryable) |
Коды, для которых повтор не выполняется (525, 526), не включают Retry-After заголовок.
Значения Retry-After для кодов 1xxx
Шесть повторяемых кодов ошибок 1xxx создают Retry-After:
| Код | retry_after (в секундах) |
Имя ошибки |
|---|---|---|
| 1004 | 120 | Ошибка разрешения DNS |
| 1015 | 30 | Ограничено по скорости |
| 1033 | 120 | Ошибка Argo Tunnel |
| 1038 | 60 | Превышен лимит заголовков HTTP |
| 1200 | 60 | Лимит соединений для кеша |
| 1205 | 5 | Слишком много перенаправлений |
Все остальные коды ошибок 1xxx не подлежат повторной попытке и не содержат Retry-After заголовок.
Если правило ограничения частоты запросов WAF уже установило динамический Retry-After значение в ответе, это значение имеет приоритет над значением по умолчанию.
Дополнительные ресурсы
- Ошибки Cloudflare 1xxx
- Ошибки Cloudflare 5xx
- Custom Errors
- Лимиты подключений
- Markdown for Agents (преобразование содержимого)
- RFC 9457: Problem Details for HTTP APIs ↗