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 は、標準の HTTP コンテンツネゴシエーション ↗ に従い、クライアントの Accept ヘッダーでレスポンス形式を選びます。複数の形式が受け入れ可能なときは、品質係数(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 を使うゾーンでは、クライアントへ返す内容をすべて制御できます。
クライアントが受け取る内容は、ゾーンに設定したカスタムエラー機能によって変わります。詳細は次の各節を参照してください。
ほとんどのゾーンのデフォルトです。Cloudflare は、クライアントが要求した形式でデフォルトのエラーレスポンスを返します。
| クライアントの送信 | レスポンス |
|---|---|
Accept: application/json |
Cloudflare のデフォルトの構造化 JSON レスポンス |
Accept: text/markdown |
Cloudflare のデフォルトの構造化 Markdown レスポンス |
Accept: text/html |
Cloudflare のデフォルト HTML エラーページ |
Accept ヘッダーなし |
Cloudflare のデフォルト HTML エラーページ |
ゾーンに、Cloudflare ダッシュボードからアップロードした Error Page があります。Custom Error Rules は未設定です。Error Page は Accept ヘッダーに関係なく、すべてのクライアントへ返されます。Error Pages はコンテンツネゴシエーションを行いません。
| クライアントの送信 | レスポンス |
|---|---|
Accept: application/json |
カスタム HTML エラーページ |
Accept: text/markdown |
カスタム HTML エラーページ |
Accept: text/html |
カスタム HTML エラーページ |
Accept ヘッダーなし |
カスタム HTML エラーページ |
エージェントには構造化レスポンスを返しつつ、ブラウザーにはカスタム HTML を残したい場合は、Accept ヘッダーにマッチする Custom Error Rule を追加します。詳細は次の節を参照してください。
ゾーンに 1 つ以上の 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 を含む任意のリクエストヘッダーにマッチでき、特定のエラーコードを対象にできます。同じゾーンから、API クライアントには JSON、エージェントには Markdown、ブラウザーには HTML を返せます。
例: 522 エラーで API クライアントにカスタム JSON を返す
この Custom Error Rule は、クライアントが JSON を要求する 522 エラーにマッチします。
Expression: (http.response.code eq 522) and (any(http.request.headers["accept"][*] contains "application/json"))
Action: 独自のエラー形式でカスタム 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 をブラウザー向けに残しつつ、エージェントには独自の構造化内容を返したい場合は、Accept ヘッダーにマッチする Custom Error Rules を作成し、独自の JSON または Markdown を返します。どちらのルールにもマッチしないブラウザーは、引き続きカスタム HTML Error Page を受け取ります。
Cloudflare がエラーレスポンスを生成するとき、クライアントが受け取る内容は次の優先順位で決まります。
- Custom Error Rules — ルールがエラーとリクエスト条件にマッチすれば、そのルールの内容が返ります。
- Error Pages — エラータイプ向けの Error Page があり、Custom Error Rule にマッチしなければ、
Acceptヘッダーに関係なく Error Page が HTML として返ります。 - 構造化エラーレスポンス — Custom Error Rule にマッチせず、Error Page もなければ、Cloudflare はクライアントが要求した形式(JSON、Markdown、または HTML)でデフォルトレスポンスを返します。
アカウントレベルとゾーンレベルのルール、WAF のカスタムブロックレスポンス、セキュリティチャレンジページを含む全体の優先順位は、Custom Errors のドキュメントを参照してください。
{
"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."
}---
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.522 エラーの構造化 JSON レスポンスを取得します。
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-afterJSON と Markdown のレスポンスは、同じフィールドセットを含みます。JSON はフラットなオブジェクトとして返し、Markdown は YAML frontmatter のあとに本文セクションを置きます。次のフィールド定義は両方の形式に適用されます。
JSON レスポンスは RFC 9457(Problem Details for HTTP APIs) ↗ に従います。Problem Details を理解する任意の HTTP クライアントは、Cloudflare 固有のコードなしで、標準の 5 メンバー(type、title、status、detail、instance)をパースできます。
| フィールド | 型 | 説明 |
|---|---|---|
type |
string | このエラーコードの Cloudflare ドキュメントを指す URI です。 |
title |
string | 短い要約です。例: "Error 522: Connection timed out"。 |
status |
integer | レスポンスの HTTP ステータスコードです。 |
detail |
string | 何が起きたか、どの当事者の責任かを説明するプレーンテキストです。 |
instance |
string | このエラー発生を識別する Ray ID です。 |
| フィールド | 型 | 説明 |
|---|---|---|
error_code |
integer | 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 または null | 再試行までの待機秒数です。retryable が true のときだけ存在します。Retry-After HTTP ヘッダーの値と一致します。 |
owner_action_required |
boolean | エラー解消のためにサイト運営者が対応する必要があるかどうかです。 |
what_you_should_do |
string | クライアント向けの次の手順です。再試行の可否と、誰が問題を直せるかを示します。 |
footer |
string | 帰属を示す行です。 |
Markdown レスポンスは、これらのフィールドを YAML frontmatter(--- 区切り)に置き、そのあとに 3 つの本文セクションを続けます。
# Error {code}: {description}— エラーコードと短い説明の見出しです。## What Happened—detailフィールドに対応します。## What You Should Do—what_you_should_doフィールドに対応します。
frontmatter は、RFC 9457 の標準メンバー(type、title、instance)と footer フィールドを省略します。本文と重複するか、Markdown 形式では不要なためです。
error_category フィールドは障害を分類します。クライアントは本文フィールドをパースせずに、再試行とエスカレーションの動きを振り分けられます。
| カテゴリ | コード | 意味 | 再試行 |
|---|---|---|---|
origin |
502、504、520-524 | オリジンサーバー側の責任です。一時的なインフラ障害です。 | はい。retry_after でバックオフします。 |
cloudflare |
500 | Cloudflare 内部エラーです。オリジンは必ずしも関与していません。 | はい。短い再試行(30 秒)です。 |
ssl |
525、526 | オリジンの TLS 設定が壊れています(ハンドシェイク失敗または無効な証明書)。 | いいえ。運営者が TLS 設定を直すまで、再試行しても解消しません。 |
| カテゴリ | 意味 | コードの例 |
|---|---|---|
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 |
Snippet の設定エラー | 1201、1202、1203、1204、1205、1206 |
unsupported |
未対応の機能またはプロトコル | 1045 |
再試行可能なエラーコードには、標準の Retry-After ↗ HTTP レスポンスヘッダーが付きます。ヘッダーの秒数は、レスポンス本文の retry_after フィールドと一致します。
| コード | retry_after(秒) |
|---|---|
| 500 | 30 |
| 502 | 60 |
| 504 | 120 |
| 520 | 60 |
| 521 | 120 |
| 522 | 120 |
| 523 | 120 |
| 524 | 120 |
| 525 | なし(再試行不可) |
| 526 | なし(再試行不可) |
再試行不可のコード(525、526)には Retry-After ヘッダーは付きません。
再試行可能な 1xxx エラーコードのうち、Retry-After を返すのは次の 6 つです。
| コード | retry_after(秒) |
エラー名 |
|---|---|---|
| 1004 | 120 | DNS 解決エラー |
| 1015 | 30 | レート制限 |
| 1033 | 120 | Argo Tunnel エラー |
| 1038 | 60 | HTTP ヘッダー数の上限超過 |
| 1200 | 60 | キャッシュ接続数の上限 |
| 1205 | 5 | リダイレクトが多すぎます |
その他の 1xxx エラーコードは再試行不可で、Retry-After ヘッダーは付きません。
WAF のレート制限ルールが、レスポンスに動的な Retry-After 値をすでに設定している場合は、その値がデフォルトより優先されます。