【保存版】HTTPステータスコード一覧&完全解説!100〜500番台の意味とエラー対処法

この記事は約45分で読めます。
この記事が役立ったらブックマーク! あとで読み返したり、環境構築時のリファレンスに活用できます
B! はてなブックマークに追加

Webサイトを閲覧しているときや開発中に目にする「404」や「500」といった3桁の数字。
これらはHTTPステータスコードと呼ばれ、ブラウザからの要求(リクエスト)に対してサーバーがどのような結果を返したかを示す「返事」のようなものです。
IANA(インターネット標準化団体)で定義されている公式なコードは60種類以上存在しますが、実務やサイト運営で頻出するものは限られています。

本記事では、100番台〜500番台の仕組みから、現場で絶対知っておくべき重要コード、実務トラブルシューティングまで徹底解説します。

1. 3桁の数字でわかる!5つのグループ分類

HTTPステータスコードは、先頭の数字(1〜5)を見るだけで大まかな状態が瞬時に判別できるよう設計されています。

番台 分類ひとこと要約主な状態
1xx情報 (Informational)処理中だよリクエストを受け取り、処理を継続している段階
2xx成功 (Successful)成功したよ!リクエストが正常に受理・処理された
3xxリダイレクト (Redirection)別の場所へどうぞページの引っ越しやキャッシュ利用など追加動作が必要
4xxクライアントエラー
(Client Error)
あなたの指定ミスかもURL間違い、認証不足、権限なしなど要求元の問題
5xxサーバーエラー
(Server Error)
サーバー側でトラブった!プログラムのバグ、過負荷、サーバーダウンなど

2. 【番台別】HTTPステータスコードの基本構造と分類

🟠 1xx:情報(Informational)

サーバーがリクエストのヘッダーを受け取り、クライアントに処理の継続を促す暫定的なレスポンスです。

  • 100 Continue
    • 意味:巨大なデータを送る前に「受け取れる状態か?」をサーバーに事前確認し、OKならそのまま送信を続けさせる合図です。
      いきなり重いデータを送って拒否されるのを防ぎ、通信時間やデータ量のムダをなくすために使われます。
  • 101 Switching Protocols
    • 意味:手紙のように1回ずつやり取りする通常のWeb通信から、チャットなどの「常時つながるリアルタイム通信(WebSocket)」へ通信ルールを切り替える合図です。
      アプリ側の「リアルタイム通信に変えたい!」という要求(Upgrade)を、サーバーが承認したときに使われます。
  • 102 Processing
    • 意味:処理に時間がかかる作業をしている最中に、「いまちゃんと進めているから通信を切らずに待ってね!」と伝える中間報告の合図です。
      応答が遅くてフリーズしたと勘違いされる(タイムアウトする)のを防ぐために使われます。
  • 103 Early Hints
    • 意味:メインのWebページを準備している間に、「後で絶対使うデザインやプログラム(CSSやJS)を先にダウンロードしておいて!」とブラウザに先回りして渡す合図です。
      ページの完成をただ待たせるムダ時間をなくし、画面がパッと表示されるまでのスピードを極限まで速くするために使われます。

🟢 2xx:成功(Success)

リクエストが正常に理解され、受理されたことを示します。

  • 200 OK
    • 意味: ユーザーの要求通りに処理がバッチリ成功したことを伝える、最も基本の「大成功サイン(200 OK)」です。
      ネットで普段Webページが問題なく表示されたり、データの送信・更新がうまくいったりしたときは、裏で常にこれが返されています。
  • 201 Created
    • 意味: お願いされた通りに処理が完了し、「新しいデータやアカウントが無事に作られたよ!(201 Created)」と伝える合図です。
      SNSの新規会員登録や新規投稿など、「新しくデータを追加したとき」に大成功した証として使われます。
  • 202 Accepted
    • 意味:「注文や作業の受付は完了したけれど、実際の処理はこれから裏で順番に進めるね(202 Accepted)」という引換券を渡すような合図です。
      動画のエンコードや大量メール送信など、時間がかかる作業を待たせずにすぐ次の画面へ行けるようにするために使われます。
  • 203 Non-Authoritative Information
    • 意味:元の大元サーバー(オリジン)から直接届いた生データではなく、「中継役(プロキシやキャッシュサーバー)が内容を少し加工して渡しているよ(203 Non-Authoritative Information)」と知らせる合図です。
      中身自体は成功していますが、「途中でヘッダー情報などが書き換えられているかも」とクライアントに注意を促すために使われます。
  • 204 No Content
    • 意味: 処理は完璧に成功したものの、「送り返す中身(データ本文)は特に何もないよ!(204 No Content)」と伝える合図です。
      SNSの投稿削除や「いいね」ボタンの送信など、画面をまるごと再読み込みする必要がない操作のときに、通信量を節約するために使われます。
  • 205 Reset Content
    • 意味:処理は正常に完了し、「作業が終わったから、入力画面を真っ白(初期状態)に戻してね!(205 Reset Content)」とブラウザに指示する合図です。
      アンケート送信や連続で伝票を入力するフォームなどで、送信完了と同時に入力欄を自動クリアして次の入力をスムーズにさせるために使われます。
  • 206 Partial Content
    • 意味:動画や巨大ファイル丸ごとではなく、「指定された一部のデータだけ送ったよ!(206 Partial Content)」と伝える合図です。
      YouTubeなどの動画を途中から再生したり、途切れたダウンロードを続きから再開(レジューム)したりするときに通信量を節約するために使われます。
  • 207 Multi-Status
    • 意味:一度にたくさんのファイル操作(一括コピーや削除など)をした際、「ファイルごとの成功・失敗の結果を全部まとめて一覧リストで返すよ!(207 Multi-Status)」という合図です。
      「Aファイルは成功、Bファイルは失敗」のように結果がバラバラでも、1つのXMLデータにまとめて一括で報告するために使われます。
  • 208 Already Reported
    • 意味:ファイルやフォルダの一覧を取得する際、「このデータはさっき別の場所で報告したから、二重報告を省くね(208 Already Reported)」と伝える合図です。
      ショートカットなどによる「同じフォルダの無限ループ(重複チェック)」を防ぎ、通信データが無駄に膨らむのを避けるために使われます。
  • 226 IM Used
    • 意味:ファイル丸ごとを送り直すのではなく、「前回の状態から変更された『差分(アップデート分)』だけを送ったよ!(226 IM Used)」と伝える合図です。
      少し書き換えただけの重い文書を最初から全部ダウンロードし直す無駄を省き、通信量と時間を大幅に節約するために使われます。

🔵 3xx: リダイレクト(Redirection)

指定されたリソースを取得するために、ブラウザが別のURLへ自動転送したりキャッシュを利用したりする必要があります。

  • 300 Multiple Choices
    • 意味:「候補がいくつかあるから、好きなものを1つ選んでね!(300 Multiple Choices)」と複数の選択肢を提示する合図です。
      同じサイトに日本語版・英語版があったり、複数のファイル形式(PDFやHTMLなど)が用意されていたりするときに、どれを表示するか選ばせるために使われます。
  • 301 Moved Permanently(恒久的な転送)
    • 意味: 「このページは完全に新しいURLへ引っ越しました!(301 Moved Permanently)」と伝える合図です。
      ブックマークやGoogleの検索順位評価を新しいページへ完全に引き継がせ、古いURLにアクセスした人を自動で新URLへ飛ばす(リダイレクトする)ために使われます。
  • 302 Found / 307 Temporary Redirect(一時的な転送)
    • 意味: 「いまだけ一時的に別のURLへ案内するね!(302 Found / 307 Temporary Redirect)」という合図です。
      サイトのメンテナンス中や期間限定キャンペーンなどで別ページへ自動転送しつつ、Googleの検索評価や元のURLの価値はそのまま残したいときに使われます。
  • 303 See Other
    • 意味:決済や投稿ボタンを押したあと、「完了ページ(GET)へ案内して二重注文や多重投稿を防ぐよ!(303 See Other)」という合図です。
      画面の更新(F5キー)を押したときに「同じ商品がもう一度買われてしまう」といった重大な誤動作を完全に防ぐために使われます。
  • 304 Not Modified
    • 意味: 「前にダウンロードしたデータから何も変わっていないから、手元の保存データ(キャッシュ)をそのまま使ってね!(304 Not Modified)」という合図です。
      同じデータを何度もネットから落とし直す無駄をなくし、通信量を大幅に節約してWebページの表示を一瞬で終わらせるために使われます。
  • 305 Use Proxy
    • 意味:セキュリティ上の理由により現在は非推奨(RFCで廃止)。指定されたプロキシ経由でアクセスする必要があることを示していた。
  • 307 Temporary Redirect
    • 意味:「一時的に別のURLへ案内するけれど、送信したデータや操作内容(POSTなど)はそのまま引き継いでね!(307 Temporary Redirect)」という合図です。
      従来のあいまいな一時転送(302)と違い、フォームに入力した内容などを勝手に書き換えず、そのまま安全に別の転送先サーバーへ送り直したいときに使われます。
  • 308 Permanent Redirect
    • 意味:「完全に新しいURLへ引っ越したけれど、送信したデータや操作内容(POSTなど)は一切変えずにそのまま新URLへ送り直してね!(308 Permanent Redirect)」という合図です。
      従来の完全引っ越し(301)と違い、フォームの送信内容などが勝手に閲覧用(GET)にすり替わってしまうのを防ぎ、安全かつ確実に新URLへ恒久移行させるために使われます。

🟡 4xx: クライアントエラー(Client Error)

リクエスト構文の誤り、権限不足、認証切れなど、アクセス元(ブラウザ・APIクライアント)に起因するエラーです。

  • 400 Bad Request
    • 意味: 「送られてきたお願いの書き方や入力内容(パラメータ)が間違っていて理解できないよ!(400 Bad Request)」という合図です。
      必須項目の入力漏れ、文字数オーバー、JSONの構文エラーなど、クライアント(利用側)のリクエストに不備があるため、サーバー側で処理を進められないときに使われます。
  • 401 Unauthorized
    • 意味: 「見るためのカギ(ログイン情報や有効なAPIトークン)がないか、間違っているよ!(401 Unauthorized)」という合図です。
      ログインしていない状態でのアクセスや、パスワード間違い、トークンの有効期限切れなど、「本人確認(認証)」が正しく通らないため処理を拒否するときに使われます。
  • 403 Forbidden
    • 意味: 「あなたは誰か分かったけれど、この場所を見る権限がないからお断りだよ!(403 Forbidden)」という合図です。
      管理者専用ページに一般ユーザーがアクセスしたときや、IP制限、WAF(セキュリティ防御)による遮断、サーバー上のファイル権限(パーミッション)不足など、「認証自体は通っていてもアクセスを絶対に許可しない」ときに使われます。
  • 404 Not Found
    • 意味: 「探しているページやファイルがどこにも見つからないよ!(404 Not Found)」という合図です。
      URLの入力ミス、削除された古い記事、リンク切れ(デッドリンク)など、指定された場所にリソースが存在しないため表示できないときに最もよく見かけるエラーです。
  • 405 Method Not Allowed
    • 意味:「そのページに対してその操作方法(HTTPメソッド)は使えないよ!(405 Method Not Allowed)」という合図です。
      閲覧専用(GET)のURLにデータを新規送信(POST)しようとしたり、更新不可のデータに対して削除(DELETE)を試みたりした際、サーバー側が許可していないメソッドでリクエストされたことを伝えるために使われます(通常、レスポンスのAllowヘッダーで使えるメソッド一覧を知らせます)。
  • 406 Not Acceptable
    • 意味:「指定されたデータ形式(JSON、XMLなど)や言語・文字コードでは返せないよ!(406 Not Acceptable)」という合図です。
      ブラウザやアプリ側が「JSON形式でちょうだい(Accept: application/json)」や「日本語ページでちょうだい(Accept-Language: ja)」と条件を指定して要求したものの、サーバー側がその条件に合うデータ(コンテンツ)を用意できないときに使われます。
  • 407 Proxy Authentication Required
    • 意味:「目的のサーバーに行く前に、中継役のプロキシサーバーで本人確認(認証)をしてね!(407 Proxy Authentication Required)」という合図です。
      社内ネットワークや特定のゲートウェイを経由してインターネットにアクセスする際、プロキシを利用するためのユーザー名・パスワードが抜けているか間違っているため、通信がせき止められたときに使われます。
  • 408 Request Timeout
    • 意味:「待っていたけれど時間切れ(タイムアウト)になるまでリクエストが届ききらなかったよ!(408 Request Timeout)」という合図です。
      電波や通信環境が極端に悪く、アップロードが途中で止まってしまったり、データの送信がサーバーの制限時間(許容タイムアウト)内に完了しなかったりしたときに、サーバー側が接続を打ち切るために使われます。
  • 409 Conflict
    • 意味:「今のデータ状態と矛盾(データの衝突・競合)が起きるから受け付けられないよ!(409 Conflict)」という合図です。
      すでに登録済みのメールアドレス・ユーザー名で新規登録しようとしたり、同じデータを複数人で同時に編集して古いバージョンを上書きしようとしたりした際、データの整合性を守るためにリクエストを拒否するときに使われます。
  • 410 Gone
    • 意味:「このページ・ファイルは完全に消滅(削除)していて、もう二度と戻らないし引っ越し先もないよ!(410 Gone)」という合図です。
      単に見つからないだけの「404(Not Found)」と違って「意図的に完全に消した」ことを明確に示すため、Googleなどの検索エンジンに対して「もう再訪する必要はないから、検索結果のインデックスから即座に削除してね」と強力に伝えるために使われます。
  • 411 Length Required
    • 意味:「送られてくるデータの全体の長さ(データサイズ:Content-Length)が書いていないから受け取れないよ!(411 Length Required)」という合図です。
      POSTやPUTなどでデータを送信する際、サーバー側が「どれだけの容量のデータが送られてくるか」を事前に把握して安全にメモリやバッファを確保するために、Content-Length ヘッダーを必須としている場合に拒否するために使われます。
  • 412 Precondition Failed
    • 意味:「リクエストで出された前提条件(If-Match 等の検証)に合致しなかったから実行しないよ!(412 Precondition Failed)」という合図です。
      Web上のデータ更新で「自分が読み込んだときから誰にも書き換えられていない場合のみ上書きする」という楽観的ロック(同時更新の衝突防止)を行う際、すでに他の人が先にデータを更新していてETagなどが一致しなかった場合に、意図しないデータの上書き事故を防ぐために使われます。
  • 413 Payload Too Large
    • 意味:「送られてきたデータ(ファイル)が大きすぎてサーバーの許容サイズを超えちゃったよ!(413 Payload Too Large / 413 Request Entity Too Large)」という合図です。
      スマホの高解像度写真や大きな動画ファイルなどをアップロードした際、Webサーバー側(Nginxの client_max_body_size やWebアプリの設定など)で定められた上限容量を超過したため、サーバーのメモリ圧迫や過負荷を防ぐ目的でリクエストを遮断するときに使われます。
  • 414 URI Too Long
    • 意味:「URL(アドレス)が長すぎてサーバーが読み切れないよ!(414 URI Too Long)」という合図です。
      GET送信で大量のパラメータや長大な検索条件・トークンなどをURLに詰め込みすぎた際、Webサーバー側で定められているURLの最大文字数・長さの上限を超えたため、リクエストを拒否するときに使われます(大量のデータを送る場合はPOSTメソッド等への変更を促します)。
  • 415 Unsupported Media Type
    • 意味:「送られてきたデータの種類・形式(Content-Type)に対応していないから処理できないよ!(415 Unsupported Media Type)」という合図です。
      JSONデータ(application/json)を受け取る前提のAPIエンドポイントに対して画像ファイルやプレーンテキストを送信したり、対応していないエンコード形式・ファイル形式でデータをアップロードしたりした際、サーバー側が形式不一致として拒否するときに使われます。
  • 416 Range Not Satisfiable
    • 意味:「要求されたデータの範囲(Range指定)がファイルの実際のサイズ外にあって取り出せないよ!(416 Range Not Satisfiable)」という合図です。
      動画のシーク再生やファイルの分割・レジューム(途中再開)ダウンロードなどで「1000バイト目〜2000バイト目をちょうだい(Range: bytes=1000-2000)」と指定されたものの、実際のファイルが500バイトしかなかった場合など、サーバー側が「その範囲は存在しない」と伝えるために使われます。
  • 417 Expectation Failed
    • 意味:「リクエストで提示された事前のお願い・期待条件(Expect ヘッダー)を満たせないから処理できないよ!(417 Expectation Failed)」という合図です。
      クライアントが巨大なファイルをアップロードする前などに「この大きなデータを今から送っても大丈夫?(Expect: 100-continue)」とお伺いを立てたものの、サーバーや経由するプロキシサーバーがその条件に対応・許容できない場合に、無駄なデータ送信を防ぐために使われます。
  • 418 I'm a teapot
    • 意味:「私はティーポットなので、コーヒーを淹れることはできません!(418 I'm a teapot)」という合図です。
      1998年のエイプリルフールに「超テキスト・コーヒーポット制御プロトコル(HTCPCP)」というジョーク仕様(RFC 2324)で定められたもので、「紅茶用のポットにコーヒーを淹れさせようとするな」というユーモアあふれるエラーです。正式なHTTP規格ではないものの、エンジニアの遊び心(イースターエッグ)として多くのWebフレームワークやAPIに今なお愛され実装され続けています。
  • 421 Misdirected Request
    • 意味:「このサーバーは、そのリクエストに対して正しい応答を返せる宛先じゃないよ!(421 Misdirected Request)」という合図です。
      HTTP/2やHTTP/3のように1つの接続(コネクション)を複数のドメインで賢く使い回す仕組みのなかで、サーバーが対応していないドメイン向けのリクエストが誤って届いてしまった際、クライアントに「接続を切り直して正しい別のサーバーへ送り直してね」と伝えるために使われます。
  • 422 Unprocessable Entity
    • 意味:「JSONやXMLの書き方(構文)は合っているけれど、中身のデータ(型・必須項目・文字数制限など)に不備があって処理できないよ!(422 Unprocessable Content / 422 Unprocessable Entity)」という合図です。
      文法エラーを指す「400(Bad Request)」とは異なり、データ構造としては正しく読み取れたものの、ビジネスロジックや入力バリデーション(例: 年齢欄に文字列が入っている、パスワードの文字数不足など)で弾かれたことを正確に伝えるため、現代のREST APIで非常によく利用されています。
  • 423 Locked
    • 意味:「操作したいファイルやデータが現在ロック(編集中・排他制御中)されているから変更できないよ!(423 Locked)」という合図です。
      WebDAV環境などで、複数人によるファイルの同時上書きを防ぐためにリソースがロックされている際、ロックトークンを持たないリクエストやロック解除前の更新・削除・移動などの操作を拒否するために使われます。
  • 424 Failed Dependency
    • 意味:「連動する前のアクション(リクエスト)が失敗したから、この処理も道連れで中止したよ!(424 Failed Dependency)」という合図です。
      WebDAVなどで一連の連続したバッチ処理や複数リソースへの一括操作を行う際、先行するリクエストの失敗(依存関係の破綻)によって後続の処理も実行できなくなったことをクライアントに伝えるために使われます。
  • 425 Too Early
    • 意味:「まだ通信の安全が完全に確認される前のフライングデータ(Early Data)だから、リプレイ攻撃を防ぐために受け取れないよ!(425 Too Early)」という合図です。
      TLS 1.3の「0-RTT(ゼロ・ラウンドトリップ・タイム)」機能を使って接続確立前に素早く送られてきたリクエストに対し、第三者によるパケットの盗聴・再送(リプレイ攻撃)の危険性があるとサーバーが判断した際、「まずはTLSハンドシェイクを完全に完了させてから、安全にもう一度送り直してね」と安全側に倒して処理を拒絶するときに使われます。
  • 426 Upgrade Required
    • 意味:「今の古い通信プロトコルのままでは処理できないから、もっと新しい規格(TLS 1.3やHTTP/2など)にバージョンアップしてね!(426 Upgrade Required)」という合図です。
      サーバー側が「現在のプロトコル(例: 古い平文のHTTP/1.1など)での通信は受け付けないが、クライアントがより安全または新しいプロトコルへアップグレード(切り替え)するなら受け入れるよ」と要求する際に使われます(通常、レスポンスの Upgrade ヘッダーで対応可能なプロトコル一覧を提示します)。
  • 428 Precondition Required
    • 意味:「更新の衝突(ロストアップデート)を防ぎたいから、条件付きリクエスト(If-Match や If-Unmodified-Since 等)を必ず付けて送り直してね!(428 Precondition Required)」という合図です。
      他のユーザーによる意図しないデータの上書きを防ぐため、サーバー側が「現在のバージョン情報(ETagなど)を確認するヘッダーが付いていない無条件の更新・削除リクエスト」を一律で拒否し、安全な排他制御(楽観的ロック)を強制するために使われます。
  • 429 Too Many Requests
    • 意味: 「短時間にリクエストを送りすぎだよ!少し落ち着いて待ってからやり直してね!(429 Too Many Requests)」という合図です。
      Web APIの利用制限(レートリミット:例「1分間に100回まで」)を超過した場合や、スクレイピングボットの暴走・DoS攻撃によるサーバー過負荷を防ぐために使われます。
      多くの場合、レスポンスヘッダーに「あと何秒待てば再試行できるか(Retry-After: 60)」などが付与されます。
  • 431 Request Header Fields Too Large
    • 意味:「リクエストヘッダー(巨大なCookieなど)が大きすぎてサーバーの許容範囲を超えているから処理できないよ!(431 Request Header Fields Too Large)」という合図です。
      Cookieが肥大化しすぎたり、認証トークンやカスタムヘッダーのサイズ・数がWebサーバー(ApacheやNginx、Node.jsなど)の上限設定を超えてしまった際に、バッファオーバーフローやメモリ圧迫を防ぐ目的でリクエストを拒否するときに使われます(ブラウザのCookieを削除すると解消することが多いエラーです)。
  • 451 Unavailable For Legal Reasons
    • 意味:「法律・裁判所命令・著作権・政府の検閲などの法的理由により、このページへのアクセスは差し止められているよ!(451 Unavailable For Legal Reasons)」という合図です。
      レイ・ブラッドベリのディストピア小説『華氏451度』(本が禁じられ焼却される社会を描いた作品)にちなんで名付けられたHTTPステータスコードです。
      単なる技術的なエラーや権限不足(403 Forbidden)ではなく、「著作権侵害の申し立て」「GDPR等の法令への抵触」「裁判所の差し止め命令」「国家による検閲」など、正当な法的手続き・法的要請によってコンテンツの公開を遮断していることを透明性をもって明示するために使われます。レスポンス本文には、アクセスを遮断した法的根拠や要求者の情報が記載されることが推奨されています。

🔴 5xx: サーバーエラー(Server Error)

リクエスト自体は正しいものの、サーバー側(Webサーバー、バックエンドAPI、データベース)の障害や不具合によって処理を完遂できなかったエラーです。

  • 500 Internal Server Error
    • 意味: 「サーバー側で予期せぬトラブル・致命的なバグが起きてリクエストを処理できなかったよ!(500 Internal Server Error)」という合図です。
      クライアント側のリクエスト自体には問題がなくても、サーバー側のプログラム(PHP/Python/Ruby/Javaなど)でキャッチされていない例外(Unhandled Exception)が発生したり、データベース接続のクラッシュ、.htaccess やWebサーバー設定ファイルの構文エラーなどが起きた際に返される最も代表的なサーバーエラーです。具体的なエラー原因を外部に漏らさないための「何らかの内部障害」を示す包括的なステータスコードとしても機能します。
  • 501 Not Implemented
    • 意味: 「そのHTTPメソッドや機能は、このサーバー自体が実装(サポート)していないから処理できないよ!(501 Not Implemented)」という合図です。
      特定のURLでそのメソッドが禁止されていることを示す「405(Method Not Allowed)」とは異なり、サーバー全体としてそのリクエストメソッド(未知の独自メソッドや、未対応の仕様など)を認識・処理する機能自体が存在しない場合に使われます。将来的に実装予定の新機能へのリクエストや、サーバーが対応していないHTTP機能が要求された際に返されます。
  • 502 Bad Gateway
    • 意味:「玄関口のリバースプロキシ(Nginxやロードバランサーなど)が後ろのバックエンド(FastAPIやNode.jsなど)に取り次ごうとしたけれど、向こうが落ちているかおかしな返事をしてきたから通信できないよ!(502 Bad Gateway)」という合図です。
      手前のWebサーバー自体には問題がないものの、背後で動いているはずのアプリケーションプロセスがメモリ不足などでクラッシュしていたり、壊れたレスポンスを返してきた場合に使われます。インフラ障害で最も頻出するエラーの一つで、プロキシ側ではなく奥のバックエンド側の稼働状況やエラーログを調べる必要があります。
  • 503 Service Unavailable
    • 意味: 「サーバーがアクセス殺到でパンクしているか、メンテナンス中だから今は一時的にサービスを利用できないよ!(503 Service Unavailable)」という合図です。
      サーバーが永久に壊れたわけではなく、一時的な過負荷や計画メンテナンスによってリクエストを処理できない状態であることをユーザーや検索エンジンのクローラーに伝えるために使われます。通常はレスポンスに Retry-After ヘッダーを付けて「あと何秒後(または何時)に再アクセスしてね」と復帰の目安を提示するのが望ましいとされています。
  • 504 Gateway Timeout
    • 意味: 「玄関口のプロキシサーバー(Nginxやロードバランサーなど)が後ろのバックエンドに応答を待っていたけれど、制限時間内に返事が返ってこなくて待ちきれなかったよ!(504 Gateway Timeout)」という合図です。
      バックエンド自体が落ちている「502(Bad Gateway)」とは異なり、サーバー自体は動いているものの、処理に時間がかかりすぎてタイムアウト時間(例: 60秒)を超えてしまった場合に使われます。重いデータベースのSQLクエリや、外部APIの遅延、時間のかかる重いファイル処理などをバックエンド側で実行させている際によく発生します。
  • 505 HTTP Version Not Supported
    • 意味:「リクエストで使われた通信の規格(HTTP/1.0など)が古すぎるか未対応で、このサーバーではそのバージョンのHTTPをサポートしていないから処理できないよ!(505 HTTP Version Not Supported)」という合図です。
      リクエストのURLやデータ内容の問題ではなく、通信プロトコルのバージョン自体がサーバー側の対応外(サポート終了した古いバージョンや未知のバージョン)である場合に使われます。サーバーが処理可能な主要なHTTPバージョン(HTTP/1.1やHTTP/2など)を指定して通信し直す必要があります。
  • 506 Variant Also Negotiates
    • 意味:「サーバーのコンテンツネゴシエーション(最適なファイル形式や言語を選ぶ仕組み)の設定がおかしくて、候補自身がさらに別の候補を探そうとして無限ループ(循環参照)になっているよ!(506 Variant Also Negotiates)」という合図です。
      ユーザーの環境に合わせたコンテンツ(言語や形式など)を自動で選ぶ透過型コンテンツネゴシエーション機能において、サーバー側の内部設定ミスで選ばれたバリアント(候補)自体が別のネゴシエーション先を指してしまい、正しいレスポンスを決定できなくなった場合に使われます。プログラムの例外ではなく、Webサーバー側のネゴシエーション設定の不具合を示すエラーです。
  • 507 Insufficient Storage
    • 意味:「ファイルを保存・更新しようとしたけれど、サーバー側の保存領域(ストレージ)に空き容量が足りなくて処理を完了できないよ!(507 Insufficient Storage)」という合図です。
      WebDAVなどでリクエストされたファイルのアップロードや変更操作を実行する際、サーバーのディスク容量不足やユーザーのクォータ(割り当て上限)オーバーによってデータを書き込めなかった場合に使われます。クライアント側が不要なファイルを削除して空き容量を確保するか、サーバー側のストレージを増設する必要があります。
  • 508 Loop Detected
    • 意味:「リクエストを処理しようとしたら、リソース同士の参照関係などが堂々巡りになっていて無限ループを検出したから処理を中断したよ!(508 Loop Detected)」という合図です。
      WebDAV環境などで「フォルダ配下の全体をまとめて処理するリクエスト(Depth: infinity)」を実行した際、シンボリックリンクやリソースの相互バインディングによって同じ階層を無限にぐるぐる参照し続けているとサーバーが察知した場合に使われます。サーバーが処理落ち(ハングアップ)するのを防ぐための安全停止エラーです。
  • 510 Not Extended
    • 意味:「リクエストを処理するために、このサーバーが対応していない追加機能(HTTP拡張仕様)が必須になっているから処理できないよ!(510 Not Extended)」という合図です。
      HTTPの拡張フレームワーク(RFC 2774)において、クライアントが「特定の拡張機能を使うこと」を必須条件としてリクエストしたものの、サーバー側がその拡張機能に対応・サポートしていない場合に使われます。サーバーは「どのような拡張が必要か」のポリシー情報をレスポンスに含めて返し、クライアント側に再設定を促します。
  • 511 Network Authentication Required
    • 意味:「インターネットを利用する前に、公共Wi-Fiのログイン画面や利用規約への同意(キャプティブポータル)を先に済ませてね!(511 Network Authentication Required)」という合図です。
      カフェやホテル、空港などの公衆無線LAN(フリーWi-Fi)に接続した際、目的のWebサイトを開く前にネットワーク自体の認証や規約同意が必要であることを端末側に通知するために使われます。OSやブラウザがこのステータスコード(とログイン画面へのURL)を受け取ることで、ユーザーに自動でログイン用のポップアップ画面を表示させることができます。

3. 実務で遭遇する「独自拡張ステータスコード」

標準仕様(RFC)には含まれないものの、主要なWebサーバーやCDNが独自に定義している実務上重要なコードです。

① Cloudflare 独自コード(520番台)

  • 520 Web Server Returned an Unknown Error
    • 意味:「CDNやプロキシ(Cloudflareなど)がオリジンサーバー(元のVPSやWebサーバー)に問い合わせたけれど、予期しない空の応答やプロトコル違反のデータが返ってきて解釈不能だったよ!(520 Web Server Returned an Unknown Error)」という合図です。
      CDNの手前側ではなく背後にあるオリジンサーバー側で、TCP接続が予期せず切断されたり、HTTPヘッダーが破損していたり、レスポンスが完全に空のまま返ってきた場合(Cloudflare等の独自拡張エラーとして)に使われます。Webサーバー(Apache/Nginx)のクラッシュやPHPのメモリ枯渇・セグメンテーション違反など、オリジン側で何らかの異常停止が発生しているサインです。
  • 521 Web Server Is Down
    • 意味:「Cloudflareがオリジンサーバー(元のVPSなど)に通信しに行ったら、TCP接続を完全に拒否されて繋がらなかったよ!(521 Web Server Is Down)」という合図です。
      手前のCDN(Cloudflare)側には問題がないものの、背後にあるオリジン側でWebサーバー(NginxやApacheなど)のプロセスが完全に停止しているか、ファイアウォール(iptablesやUFW、クラウドのセキュリティグループ)によってCloudflareからのアクセスが遮断されている場合に使われます。オリジンサーバーにログインしてWebサービスを起動し直すか、接続設定を見直す必要があります。
  • 522 Connection Timed Out
    • 意味: 「Cloudflareがオリジンサーバー(元のVPSなど)と通信を始めようとしたけれど、最初の接続確立(TCPハンドシェイク)の制限時間内に返事がなくてタイムアウトしたよ!(522 Connection Timed Out)」という合図です。
      接続自体を即座に拒否される「521」とは異なり、そもそもパケットへの返答が時間内に届かない状態を示します。オリジンサーバーが高負荷でCPUやリソースを使い果たして応答できない場合や、ホスティング環境・OSのファイアウォール(iptablesやセキュリティグループなど)でCloudflareのIPアドレス帯が誤って遮断・ドロップされている際によく使われます(Cloudflareの独自拡張エラーです)。
  • 523 Origin Is Unreachable
    • 意味:「DNSの向き先(オリジンIP)が間違っているか、インターネット経路上のルーティング障害のせいでオリジンサーバー(元のVPSなど)までパケットが全く辿り着けないよ!(523 Origin Is Unreachable)」という合図です。
      手前のCDN(Cloudflareなど)がオリジンサーバーへ通信を試みたものの、そもそもIPアドレスへの到達経路(ルート)が存在しないか途中で遮断されている場合に使われます(Cloudflareの独自拡張エラーです)。CloudflareのDNS管理画面で指定しているオリジンサーバーのIPアドレスが古い・間違っている場合や、ホスティング事業者側のネットワーク障害などで経路情報(BGPなど)が途切れている際によく発生します。
  • 524 A Timeout Occurred
    • 意味:「Cloudflareとオリジンサーバーとの接続自体は成功したけれど、オリジン側の処理が長すぎて制限時間(100秒)以内にHTTPレスポンスが返ってこなくて待ちきれなかったよ!(524 A Timeout Occurred)」という合図です。
      接続自体が失敗する「522」とは異なり、通信の確立までは正常にできたものの、背後のオリジン側で重いデータベースクエリ、長時間のデータ集計・エクスポート処理、巨大なファイル生成などの処理が終わらずにタイムアウトした場合に使われます(Cloudflareの独自拡張エラーです)。重い処理を非同期(バックグラウンド処理)にするか、クエリの最適化を行う必要があります。
  • 525 SSL Handshake Failed
    • 意味:「Cloudflareとオリジンサーバー(元のVPSなど)の間で安全な通信路を作ろうとしたけれど、暗号化通信の最初の握手(SSL/TLSハンドシェイク)に失敗して接続できなかったよ!(525 SSL Handshake Failed)」という合図です。
      通常のTCP接続自体は通っているものの、暗号化通信を確立する段階で、オリジン側とCloudflare側でお互いが対応している暗号スイート(暗号化方式)やTLSプロトコルバージョンの擦り合わせが合わなかった場合などに使われます(Cloudflareの独自拡張エラーです)。オリジン側のWebサーバー(NginxやApacheなど)のSSL設定で古いTLSバージョンしか許可されていないケースや、SSLポート(443番)の設定不備などが主な原因になります。
  • 526 Invalid SSL Certificate
    • 意味:「Cloudflareがオリジンサーバー(元のVPSなど)のSSL証明書を確認したけれど、期限切れ・自己署名(オレオレ証明書)・ドメイン不一致のどれかで証明書が正当だと検証できなかったよ!(526 Invalid SSL Certificate)」という合図です。
      Cloudflareの暗号化モードを厳格な「Full (strict)」に設定している環境において、オリジン側のWebサーバーにインストールされているSSL/TLS証明書が信頼できる認証局から発行されていなかったり、有効期限が切れていたりする場合に使われます(Cloudflareの独自拡張エラーです)。オリジンサーバー側でLet’s Encryptなどの正規のSSL証明書を正しく更新・再設定するか、Cloudflareが提供する「Origin CA証明書」をインストールすることで解消できます。

② Nginx 独自コード(49x番台)

  • 494 Request Header Too Large:
    • 意味:「リクエストに含まれるHTTPヘッダー全体のサイズや個別ヘッダーが長すぎて、Nginxが設定している読み込みバッファの上限を超えてしまったから処理できないよ!(494 Request Header Too Large / 431 Request Header Fields Too Large)」という合図です。
      巨大なCookieや肥大化した認証トークン(JWTなど)、長大なリファラ(Referer)が含まれていることで、Webサーバー(Nginx等)の許容サイズ(client_header_buffer_size や large_client_header_buffers)をオーバーした際によく使われます。不要なCookieの削除やトークンの見直し、あるいはNginx側の設定でバッファサイズを引き上げることで解消できます。
  • 495 SSL Certificate Error
    • 意味:「クライアント側から提出されたSSL証明書(クライアント証明書)を確認したけれど、有効期限切れや署名の不一致、失効などで検証に失敗したからアクセスを許可できないよ!(495 SSL Certificate Error)」という合図です。
      社内システムや強固なAPI連携などで「相互TLS(mTLS)認証」を設定している環境において、Webサーバー(Nginx)側が要求したクライアント証明書が不正・期限切れ・未承認の認証局による発行だった場合などに使われます(Nginx独自のステータスコードです)。端末側に正しい最新のクライアント証明書を再インストールするか、サーバー側の信頼する認証局(CA)設定を見直す必要があります。
  • 496 SSL Certificate Required
    • 意味:「このサイトやAPIを利用するにはクライアント証明書(電子証明書)の提示が必須なのに、ブラウザや端末から証明書が一切送られてこなかったから門前払いするよ!(496 SSL Certificate Required)」という合図です。
      こちらもNginxの独自コード(通常は400番にマップされる)で、強固なセキュリティのために「特定の証明書を持つ許可された端末しか通さない(mTLS)」設定になっているサーバーへ、証明書をセットしていない一般のブラウザやアプリがアクセスしてきた場合に使われます。端末側に対象のクライアント証明書を正しくインストールして選択させる必要があります。
  • 497 HTTP Request Sent to HTTPS Port
    • 意味:「暗号化通信(HTTPS)専用のポート(443番など)に繋いできたのに、SSL/TLSを通さずに生のHTTP(平文)でリクエストを送ってきちゃったから処理できないよ!(497 HTTP Request Sent to HTTPS Port)」という合図です。
      こちらもNginx独自のステータスコードです。例えば、ブラウザやスクリプトで
      400 The plain HTTP request was sent to HTTPS port
      (http://example.com:443/)
      のように「ポート番号は443(HTTPS用)なのに、プロトコル指定が http:// のままアクセスした」場合などに発生します。
      Nginxの設定(error_page 497 https://$host:$server_port$request_uri; など)を使って、自動的に正規の https:// へリダイレクトさせるように設定するのが一般的な対処法です。
  • 499 Client Closed Request
    • 意味: 「Nginxが後ろのバックエンドからの応答を待っている途中で、クライアント(ユーザー)側が画面を閉じたり更新ボタンを押したりして接続を先に切断しちゃったよ!(499 Client Closed Request)」という合図です。
      バックエンド自体の障害を示す「502」や「504」とは異なり、サーバーが処理を行っている最中に、待ちきれなくなったユーザーがブラウザを閉じたり、フロントエンド側のタイムアウト設定によって通信が破棄された場合に使われます(Nginx独自のステータスコードです)。アクセスログでこのコードが頻発している場合は、バックエンドの処理が重すぎてユーザーが途中で離脱している可能性が高いため、パフォーマンス改善の目安になります。

4. REST API開発におけるステータスコード選定ベストプラクティス

API設計において、すべてを 200 OK で返してレスポンスボディの中に { "error": "not found" } と書くアンチパターンは避けるべきです。適切なコードを使い分けることで、クライアント側のエラー処理がシンプルになります。

操作・シナリオ最適なステータスコード理由
一覧・詳細の取得成功200 OK標準的なデータ返却
新規データの作成完了201 CreatedLocation ヘッダーに作成されたURLを添える
非同期バッチ処理の受付202 Accepted処理予約完了のみを即時応答
データの削除完了204 No Content返すべき本文がないことを明示
未ログイン・トークン切れ401 Unauthorized再認証(ログイン画面へ誘導)が必要
他人のデータへの不正操作403 Forbiddenログインはしているが権限がない
入力値バリデーション違反422 Unprocessable EntityJSON構文は正しいが業務ロジックで弾く
レート制限(API回数上限)429 Too Many RequestsRetry-After で待機秒数を返却

5. トラブルシューティング:エラー遭遇時の切り分けフローチャート

Plaintext
[Webサーバーでエラーが発生!]
 │
 ├── 403 Forbidden(アクセス拒否)
 │    ├── 1. ファイルのパーミッションと所有権を確認(例: chmod 755/644, chown www-data)
 │    ├── 2. Webサーバーのアクセス制限設定を確認(Nginxのdeny設定、Apacheの.htaccessなど)
 │    └── 3. WAFの遮断ルールやセキュリティプラグインによる誤検知(IPブロック)を確認
 │
 ├── 500 Internal Server Error(サーバー内部エラー)
 │    ├── 1. バックエンドのエラーログを確認(例: error.log, php-fpm.log, app_error.log)
 │    ├── 2. アプリケーションコードの文法エラー(構文ミス)や未捕捉の例外を確認
 │    └── 3. サーバー設定ファイルや環境変数(.env)の記述ミス・欠落を確認
 │
 ├── 502 Bad Gateway(不正なゲートウェイ)
 │    ├── 1. バックエンドサービスが起動しているか確認(例: systemctl status php-fpm / uvicorn)
 │    ├── 2. UNIXソケットのパスやポート番号の指定(例: 127.0.0.1:8000)が一致しているか確認
 │    └── 3. 高負荷によるバックエンドプロセスの突然死(OOMクラッシュ等)を確認
 │
 ├── 503 Service Unavailable(サービス利用不可)
 │    ├── 1. サーバーのリソース使用状況を確認(htop や free -m でCPU・メモリ使用率をチェック)
 │    ├── 2. Webサーバーやアプリがメンテナンスモードになっていないか確認
 │    └── 3. ワーカーの同時接続数上限を確認(Nginxのworker_connections、PHP-FPMのpm.max_children等)
 │
 └── 504 Gateway Timeout(ゲートウェイタイムアウト)
      ├── 1. データベースの遅いクエリを調査(MySQLのスロークエリログ、インデックス不足の確認)
      ├── 2. バックエンド処理の遅延や、外部API呼び出しの応答遅延を調査
      └── 3. プロキシのタイムアウト設定を延長・調整(proxy_read_timeout, fastcgi_read_timeout等)
Plaintext
[Web Server Error Occurred]
 │
 ├── 403 Forbidden
 │    ├── 1. Check file permissions & ownership (e.g., chmod 755/644, chown www-data)
 │    ├── 2. Verify web server access rules (Nginx 'deny' directives, Apache .htaccess)
 │    └── 3. Check WAF rules or security plugins for false-positive IP blocks
 │
 ├── 500 Internal Server Error
 │    ├── 1. Inspect backend error logs (e.g., /var/log/nginx/error.log, php-fpm.log)
 │    ├── 2. Check for syntax errors or unhandled exceptions in application code
 │    └── 3. Verify server configuration files and environment variables
 │
 ├── 502 Bad Gateway
 │    ├── 1. Ensure backend service is running (e.g., systemctl status php-fpm / uvicorn)
 │    ├── 2. Verify UNIX socket paths or port mappings (e.g., 127.0.0.1:8000)
 │    └── 3. Check for upstream service crashes under high load
 │
 ├── 503 Service Unavailable
 │    ├── 1. Check server resource utilization (CPU, memory via 'htop' or 'free -m')
 │    ├── 2. Verify if the server or upstream is in maintenance mode
 │    └── 3. Check worker connection limits (e.g., Nginx worker_connections, PHP-FPM pm.max_children)
 │
 └── 504 Gateway Timeout
      ├── 1. Investigate slow database queries (check MySQL slow query logs, missing indexes)
      ├── 2. Check upstream response times or external API delays
      └── 3. Adjust proxy timeout settings (e.g., proxy_read_timeout, fastcgi_read_timeout)

6. 🛠 400番台(クライアント起因)の対処法

クライアント(ブラウザやAPI呼び出し側)に原因があるエラーです。

コード主な原因👨‍💻 開発者
フロント側の対処
🌐 ユーザー側の対処
400 Bad Requestパラメータの型違い、必須項目の欠落、不正なJSONフォーマットリクエスト送信時のJSON構文やヘッダー形式、クエリパラメータのバリデーションを確認・修正するブラウザのCookie/キャッシュを削除する、入力内容を見直す
401 Unauthorizedログインしていない、トークン(JWT等)の期限切れ・無効Authorization ヘッダー(Bearer <token> など)の付与漏れやリフレッシュトークン処理を確認する再度ログインし直す
403 Forbiddenログインしているが権限がない、IP制限、WAFによるブロックロール・権限設定(RBAC等)を見直す。WAFのシグネチャに誤検知されていないかログを確認する管理者に権限付与を申請する。VPN接続の要否を確認する
404 Not FoundURLのスペルミス、APIのエンドポイント廃止、ルーティングミスフロント側のリンクURLやバックエンドのルーティング設定(react-router / Express等)を確認するURLの打ち間違いを確認する。サイト内検索を使う
429 Too Many Requests短時間での過剰なリクエスト、APIレート制限超過指数バックオフ(Exponential Backoff)とリトライ処理を実装する。不要なポーリングを減らすしばらく時間(数分〜数十分)を置いてから再アクセスする

7. 🛠 500番台(サーバー起因)の対処法

サーバーやインフラ側に原因があるエラーです。基本的にインフラ・バックエンドエンジニア側の対応が必要です。

コード主な原因⚙️ サーバー・インフラ側の
具体的対処法
500 Internal Server Errorアプリケーションの未処理例外(NullPointerなど)、バグサーバーのエラーログ(Sentry、CloudWatch等)を確認し、クラッシュしている例外処理をバグ修正する
502 Bad Gatewayバックエンド(Node/PHP/Goなど)のプロセス停止、ポート不一致1. systemctl status や pm2 status、Dockerコンテナの稼働確認
2. Nginx/Apacheとバックエンド(127.0.0.1:3000 等)の接続ポート・ソケット設定を確認
503 Service Unavailableサーバーの高負荷(CPU/メモリ100%)、メンテナンス中1. サーバーリソースのスケールアップ/アウト
2. メンテナンス画面の設定解除
3. メモリリークの調査と解消
504 Gateway Timeoutバックエンドの処理遅延(重いDBクエリ、外部API待機)1. スロークエリの特定・インデックス追加
2. 長時間処理を非同期キュー(SQS, Redis等)に逃がす
3. Nginxの proxy_read_timeout を一時的に延長

8. 🛠 プロキシ・CDN(Cloudflare / Nginx等)の対処法

コード主な原因🔧 インフラ・ネットワーク側の
具体的対処法
499 Client Closed Requestバックエンドが遅すぎてユーザーが通信を切断したバックエンドの処理速度を改善する(根本原因は504とほぼ同じ)
521 Web Server Is DownオリジンのWebサーバーが停止、またはファイアウォールで遮断1. オリジン側でWebサーバー(Nginx等)を再起動
2. UFW/iptables/セキュリティグループでCloudflareのIPを許可
522 Connection Timed Outハンドシェイクが通らない(高負荷、ルーティング遮断)オリジンサーバーの負荷を確認し、ファイアウォールでCloudflareのパケットがドロップされていないか確認
524 A Timeout Occurred100秒以内にレスポンスが返らない処理をバックグラウンド化(Webhookや非同期処理)するか、Cloudflare Enterpriseでタイムアウト上限を緩和
525 SSL Handshake FailedSSL/TLSのバージョンや暗号スイートの不一致オリジンサーバーのSSL設定を確認(TLS 1.2/1.3の有効化、443ポートのリッスン設定)
526 Invalid SSL CertificateオリジンのSSL証明書が期限切れ、または自己署名オリジンサーバーに有効なSSL証明書(Let’s Encrypt等)を再発行・更新するか、Cloudflare Origin CA証明書を導入

まとめ

  • 2xx は正常、3xx は転送、4xx は要求ミス、5xx はサーバー故障
  • 301と302/307の使い分けはサイトのSEO評価に直結する
  • 401(未認証)と403(権限なし)を混同しない
  • 502・504は「Nginxの背後にあるアプリやDB」を疑う

HTTPステータスコードは、Webの通信における世界共通の言語です。
正しく把握しておくことで、バグの特定やインフラ障害の復旧時間を劇的に短縮できます!
ステータスコードを理解しておくと、サイトが表示されないときの「原因の特定スピード」が劇的に上がります。開発時やインフラ運用のエラー調査にぜひ役立ててください!

【Webツール】Cloudflare × Nginx 設定自動ジェネレーター|本当のIP復元&520/524エラー防止設定を即時生成
Cloudflare配下のNginx設定を即時生成するWebツール。アクセスログの訪問者IP復元(CF-Connecting-IP)や520/524エラーを防ぐバッファ・タイムアウト最適化設定を自動出力。Origin CA証明書にも対応し、コピペですぐ使えます。

コメント

タイトルとURLをコピーしました