HTTP ステータスコード — 意味と例付きの完全一覧
100 から 511 までのすべての公式 HTTP ステータスコードと、nginx・Cloudflare・AWS のコードを、それぞれの使いどころとともに掲載。
1xx 情報
100Continue
暫定レスポンス:サーバーがリクエストヘッダーを受け取ったので、クライアントはそのままボディを送信してよいことを示します。
クライアントが大きなボディをアップロードする前に「Expect: 100-continue」を付けたときにサーバーが自動的に送信します。これにより、拒否されるリクエストで帯域を無駄にせずに済みます。
アプリケーションコードから最終ステータスとして送信しないでください。これはリクエストへの応答そのものではなく、本来のレスポンスの前段階にすぎません。
該当なし
PUT /upload HTTP/1.1 Content-Length: 104857600 Expect: 100-continue HTTP/1.1 100 Continue
101Switching Protocols
サーバーが、Upgrade ヘッダーで指定されたプロトコルへの接続の切り替えに同意したことを示します。
WebSocket 接続(Upgrade: websocket)のハンドシェイクのレスポンス。かつては HTTP/1.1 から h2c へのアップグレードにも使われました。
HTTP/2 と HTTP/3 では使われません。HTTP/2 上の WebSocket は代わりに拡張 CONNECT メソッド(RFC 8441)を使います。
該当なし
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
102Processing非推奨
サーバーが時間のかかる WebDAV リクエストをまだ処理中であり、クライアントはタイムアウトすべきでないことを伝える暫定レスポンスです。
WebDAV。RFC 4918 で WebDAV から削除されましたが、IANA レジストリには残っています。
深い COPY や MOVE など、時間のかかる再帰的な操作を処理するレガシーな WebDAV サーバーでのみ使われます。
新しい API では、長時間かかる処理には代わりにステータス確認用 URL 付きの 202 Accepted を返しましょう。
該当なし
HTTP/1.1 102 Processing
103Early Hints
Link ヘッダーを含む暫定レスポンスで、サーバーが最終レスポンスを準備している間に、ブラウザがプリロードや事前接続を始められるようにします。
HTML の生成に時間がかかり(サーバーサイドレンダリング、データベースクエリ)、ページに必要な CSS、フォント、オリジンが事前にわかっている場合。Chromium 系ブラウザと Firefox は 103 レスポンスの preload と preconnect のヒントに対応し、Safari は preconnect に対応しています。
Set-Cookie のように最終レスポンスにのみ適用すべきヘッダーを含めないでください。ブラウザは 103 内のほとんどのヘッダーを無視します。
該当なし
HTTP/1.1 103 Early Hints Link: </style.css>; rel=preload; as=style Link: <https://cdn.example.com>; rel=preconnect HTTP/1.1 200 OK Content-Type: text/html
104Upload Resumption Supported
開始したアップロードを後で再開できること、およびその再開先を伝える暫定レスポンスです。
IETF の再開可能アップロードのドラフトに対する IANA の暫定登録。まだ正式な RFC ではありません。
実験的:再開可能アップロードのドラフトを実装したサーバーが、アップロードリソースを示す Location ヘッダーとともに送信します。
ドラフトが RFC として公開されるまでは一般的な用途には向きません。ほとんどのクライアントやプロキシはこのコードを認識しません。
該当なし
draft-ietf-httpbis-resumable-upload
HTTP/1.1 104 Upload Resumption Supported Upload-Draft-Interop-Version: 6 Location: https://example.com/upload/b530ce8ff
2xx 成功
200OKデフォルトでキャッシュ可能
リクエストが成功しました。ボディの内容はメソッドによって異なり、GET ならリソース、POST なら処理の結果です。
GET の通常の成功レスポンス。POST、PUT、PATCH、DELETE で結果を説明するボディを返す場合にも使います。
ボディにエラーメッセージを入れて 200 を返さないでください(「ソフトエラー」)。クライアント、監視ツール、キャッシュ、検索エンジンが見るのはステータスコードであり、JSON の中身ではありません。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 200 OK
Content-Type: application/json
{"id": 42, "name": "Ada"}201Created
リクエストが成功し、1 つ以上の新しいリソースが作成されました。
何かを作成する POST(または新しい URL への PUT)の後に使います。新しいリソースを指す Location ヘッダーを含め、ボディには通常そのリソースの説明を入れます。
既存レコードの更新など、新しく何も作成されていない場合には使わないでください(200 または 204 を使います)。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 201 Created
Location: /users/42
Content-Type: application/json
{"id": 42}202Accepted
リクエストは処理のために受理されましたが、処理はまだ完了しておらず、失敗する可能性もあります。
キューに入れる処理や非同期処理:動画のエンコード、レポートの生成、一括インポートなど。クライアントがジョブの状態を確認できるリンクを返しましょう。
同期処理の「成功」の意味で使わないでください。このコードは結果について何も約束しないことを明示しています。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 202 Accepted
Location: /jobs/7f3a
Content-Type: application/json
{"status": "queued"}203Non-Authoritative Informationデフォルトでキャッシュ可能
成功ですが、変換を行うプロキシがオリジンサーバーの 200 レスポンスを変更しています。
画像を圧縮したり HTML を書き換えたりするプロキシなど、コンテンツを変更する中継サーバーが、オリジンのレスポンスそのままではないことをクライアントに伝えるためにのみ使います。
オリジンサーバーや API は送信すべきではありません。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 203 Non-Authoritative Information Content-Type: image/webp
204No Contentデフォルトでキャッシュ可能
成功で、意図的にボディがありません。
成功した DELETE、更新後のリソースを返さない PUT や PATCH、フォームの自動保存、CORS のプリフライトレスポンスなど。
ボディを含めてはいけません。クライアントは読み込まず、HTTP/1.1 では余分なボディがその接続上の次のレスポンスを壊してしまいます。返すものがある場合は 200 を使ってください。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 204 No Content
205Reset Content
成功です。クライアントは文書の表示をリセット(例:送信したフォームをクリア)すべきことを示します。
ユーザーがフォームを送信した直後に次のレコードを入力するようなデータ入力画面。
ブラウザはリセット動作を実装していないため、実際には 204 と同じように動作します。ボディを含めてはいけません。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 205 Reset Content
206Partial Contentデフォルトでキャッシュ可能
サーバーは、クライアントが Range ヘッダーで要求したバイト範囲のみを返しています。
動画や音声のシーク、再開可能なダウンロード、ファイルを並列に分割取得するダウンロードマネージャー。Content-Range を含めます。
リクエストに Range ヘッダーがあり、それに応じる場合以外は送信しないでください。Range を無視する場合は、ボディ全体とともに 200 を送ります。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
GET /video.mp4 HTTP/1.1 Range: bytes=0-1023 HTTP/1.1 206 Partial Content Content-Range: bytes 0-1023/146515 Content-Length: 1024
207Multi-Status
ボディ(XML)に、複数のリソースそれぞれのステータスが個別に含まれています。
WebDAV
PROPFIND など、多数のリソースを対象とする WebDAV の操作。一部の JSON API はバッチ用エンドポイントに流用しています。
バッチ API では、汎用クライアントが 207 を単なる成功として扱うため、項目ごとの結果を含む 200 を好むチームが多くあります。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 207 Multi-Status Content-Type: application/xml; charset="utf-8"
208Already Reported
207 レスポンスの中で、あるリソースがすでに前に列挙されているため繰り返さないことを示します(バインディングによるループを防ぎます)。
WebDAV
バインディング(RFC 5842)に対応した WebDAV サーバー。
WebDAV 以外では、トップレベルのレスポンスとして意味を持ちません。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
<D:status>HTTP/1.1 208 Already Reported</D:status>
226IM Used
サーバーが GET に対して、リソース全体ではなく、現在のリソースに差分(インスタンス操作)を適用した結果で応答しました。
HTTP の差分エンコーディング(A-IM / IM ヘッダー)。導入例はほとんどありません。
ブラウザは対応していません。通常の API では使わないでください。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 226 IM Used IM: vcdiff ETag: "v2"
3xx リダイレクト
300Multiple Choicesデフォルトでキャッシュ可能
リソースに複数の表現があり、クライアント(またはユーザー)がその中から選ぶ必要があります。
まれ:エージェント駆動型のコンテンツネゴシエーション。たとえば、文書を複数の言語や形式で提供し、それぞれへのリンクを示す場合など。
ブラウザは自動では選択しません。言語や形式の選択には、サーバー駆動型のネゴシエーションか、リンクを並べた通常のページのほうが適しています。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 300 Multiple Choices Link: </doc.en.html>; rel=alternate; hreflang=en Link: </doc.fr.html>; rel=alternate; hreflang=fr
301Moved Permanentlyデフォルトでキャッシュ可能
リソースに新しい恒久的な URL があり、Location ヘッダーで示されます。
ドメインの移転、HTTP から HTTPS への移行、スラッグの変更、重複 URL の統合。検索エンジンは評価シグナルを新しい URL に引き継ぎます。
ブラウザは 301 をたどる際に POST を GET に変えることがあります。メソッドを維持する必要がある場合(移動した API エンドポイントなど)は 308 を使ってください。ブラウザは 301 を積極的にキャッシュするので、デプロイ前にテストしましょう。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 301 Moved Permanently Location: https://www.example.com/new-page
302Found
リソースは一時的に別の URL にあります。今後も元の URL を使い続けてください。
一時的なリダイレクト:ログインへのリダイレクト、A/B テスト、メンテナンスページ、地域や言語によるリダイレクト。
ブラウザは 302 をたどる際に POST を GET に変えます(RFC が許容する歴史的な挙動)。POST 後に「結果を見に行く」場合は 303 を、メソッドを維持する必要がある場合は 307 を使ってください。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 302 Found Location: /login?next=%2Faccount
303See Other
クライアントを別の URL にリダイレクトし、その URL を GET で取得させます。
Post/Redirect/Get パターン:フォームの POST 後に結果ページへの 303 を返し、ページを再読み込みしてもフォームが再送信されないようにします。
コンテンツの移動には使いません。元の URL が移動したことは何も示しません。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 303 See Other Location: /orders/1234
304Not Modified
条件付き GET または HEAD(If-None-Match または If-Modified-Since)へのレスポンス:クライアントのキャッシュはまだ有効です。
キャッシュの再検証:このレスポンス自体は保存されませんが、クライアントがすでに持っているキャッシュ済みレスポンスを更新します。
ETag や Last-Modified の日付が一致したときにサーバーや CDN が自動的に返し、変更のないボディの転送を省きます。
ボディを送ってはいけません。条件付きでないリクエストには送らないでください。クライアントには再利用できるものがありません。
該当なし
GET /app.js HTTP/1.1 If-None-Match: "33a64df5" HTTP/1.1 304 Not Modified ETag: "33a64df5" Cache-Control: max-age=3600
305Use Proxy非推奨
非推奨。かつては、Location で指定したプロキシ経由でリクエストを再送するようクライアントに指示していました。
なし。セキュリティ上の理由で非推奨となり、ブラウザは無視します。
送信しないでください。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 305 Use Proxy
306(Unused)非推奨
予約済み。ドラフトで「Switch Proxy」として使われていましたが、現在は使われていません。
なし。
送信しないでください。
該当なし
307Temporary Redirect
一時的なリダイレクトで、クライアントは同じメソッドとボディでリクエストを再送する必要があります。
POST、PUT、DELETE リクエストの一時的なリダイレクト(メンテナンスのために移動した API エンドポイントなど)。HSTS により HTTPS が強制される場合も、ブラウザは内部的に 307 を表示します。
恒久的な移動には 308 を使います。「GET で結果を取得しに行く」場合は 303 を使います。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 307 Temporary Redirect Location: https://api2.example.com/v1/orders
308Permanent Redirectデフォルトでキャッシュ可能
恒久的なリダイレクトで、クライアントは同じメソッドとボディでリクエストを再送する必要があります。
POST や PUT を受け付ける、恒久的に移動した API エンドポイント。検索エンジンは 301 と同様に扱います。Next.js と Vercel は、恒久的なリダイレクトにデフォルトで 308 を使います。
非常に古いクライアント(Windows 7 以前の Internet Explorer)は理解できません。通常のページ移動なら 301 でも同様に機能します。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 308 Permanent Redirect Location: https://example.com/api/v2/upload
4xx クライアントエラー
400Bad Request
クライアント側のエラー(構文の誤り、不正なフレーミング、不正なパラメーター)のため、サーバーはリクエストを処理しません。
解析できない JSON、必須パラメーターの欠落、型の誤った値。ボディで問題を説明しましょう(RFC 9457 の problem+json がよい形式です)。
形式は正しいがビジネスルールに反する入力には、多くの API が 422 を使います。認証の問題には 401 または 403 を使います。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
{"title": "Invalid JSON", "detail": "Unexpected token } at position 41"}401Unauthorized
リクエストに有効な認証情報がありません。名前に反して、意味は「未認証」です。
トークンがない、トークンの期限切れ、パスワードの誤り。レスポンスには、認証方法を示す WWW-Authenticate ヘッダーを含める必要があります。
ユーザーがログイン済みでも権限がない場合は 403 を使います。WWW-Authenticate なしで 401 を送らないでください。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="api", error="invalid_token"
402Payment Required
将来の使用のために予約されています。標準的な意味は定められていません。
一部の API は「利用枠を使い切ったのでプランをアップグレードしてください」や支払いの失敗に使います(Stripe はカードが拒否されたリクエストに 402 を返します)。
クライアントがこのコードを理解することを当てにせず、ボディで問題を説明してください。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 402 Payment Required
Content-Type: application/json
{"error": "card_declined"}403Forbidden
サーバーはリクエストを理解し、相手が誰かもわかっている(または気にしていない)うえで、実行を拒否しています。
認証済みユーザーに権限がない、IP がブロックされている、ディレクトリ一覧が無効、WAF のルールが作動したなど。再認証しても解決しません。
認証情報がない、または無効な場合は 401 を使います。リソースの存在を明かすこと自体が情報漏えいになる場合は、代わりに 404 を返します。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 403 Forbidden
Content-Type: application/json
{"error": "You do not have access to this project"}404Not Foundデフォルトでキャッシュ可能
サーバーにはその URL に対応する現在の表現がないか、存在するかどうかを明かしません。
不明な URL、削除を追跡していない場合の削除済みレコード、権限のないユーザーからリソースを隠す場合。
リソースが以前存在し、完全になくなった場合は、410 がそれを明示します。「見つかりません」と表示する 200 ページ(ソフト 404)を返さないでください。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 404 Not Found Content-Type: text/html
405Method Not Allowedデフォルトでキャッシュ可能
URL は存在しますが、この HTTP メソッドには対応していません。
読み取り専用リソースへの DELETE や、GET 専用ページへの POST。レスポンスには、対応メソッドを列挙した Allow ヘッダーを含める必要があります。
権限の問題(403)や、サーバーがまったく実装していないメソッド(501)には使わないでください。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 405 Method Not Allowed Allow: GET, HEAD
406Not Acceptable
サーバーは、リクエストの Accept、Accept-Language、Accept-Encoding ヘッダーに合うレスポンスを生成できません。
JSON しか扱わない API が、代替手段なしで「Accept: application/xml」を受け取った場合。
ほとんどのサーバーは一致しない Accept ヘッダーを無視してデフォルトの形式を返します。そのほうが通常は親切です。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 406 Not Acceptable
Content-Type: application/json
{"supported": ["application/json"]}407Proxy Authentication Required
401 と同様ですが、クライアントは間にあるプロキシで認証する必要があります。
フォワードプロキシ(企業のプロキシなど)が Proxy-Authenticate ヘッダーとともに送信します。
オリジンサーバーが送信することはありません。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 407 Proxy Authentication Required Proxy-Authenticate: Basic realm="corp-proxy"
408Request Timeout
サーバーが待機できる時間内に完全なリクエストを受け取れなかったため、接続を閉じようとしています。
アイドル状態のキープアライブ接続や遅いアップロードに対してサーバーが送信します。クライアントは新しい接続でリクエストを再試行できます。
バックエンドの処理が遅い場合には使いません。それはゲートウェイでの 504 か、単に遅いレスポンスです。このコードと一緒に「Connection: close」を送ってください。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 408 Request Timeout Connection: close
409Conflict
リクエストがリソースの現在の状態と競合しています。
すでに存在するメールアドレスでのユーザー作成、他の人が変更したレコードの編集(バージョンの不一致)、空でないフォルダの削除。
If-Match / If-Unmodified-Since の条件が満たされない場合は 412 を、バリデーションエラーには 400 または 422 を使います。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error": "Email already registered"}410Goneデフォルトでキャッシュ可能
リソースは以前ここに存在しましたが、恒久的に削除され、転送先もありません。
販売終了した商品、終了したキャンペーン、削除されたアカウント、廃止された API バージョン。Google は 404 と 410 をほぼ同じように扱いますが、410 のほうが少し早くインデックスから削除されることがあります。
コンテンツが移動した場合は、代わりに 301 でリダイレクトします。恒久的かどうか確信がない場合は 404 を使います。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 410 Gone
411Length Required
サーバーは、このリクエストに Content-Length ヘッダーを要求しています。
チャンク形式のアップロードを拒否し、事前にボディのサイズを知る必要があるサーバー。
アプリケーションで必要になることはまれで、通常は Web サーバー自体が返します。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 411 Length Required
412Precondition Failed
リクエストヘッダーの条件(If-Match、If-Unmodified-Since、書き込み時の If-None-Match)が偽と評価されました。
楽観的並行性制御:クライアントが古い ETag を付けて If-Match を送った場合で、他の誰かが先にリソースを変更したことを意味します。
条件付きヘッダーとは関係のないビジネスルール違反には使わないでください(409 または 422 を使います)。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
PUT /docs/7 HTTP/1.1 If-Match: "v3" HTTP/1.1 412 Precondition Failed ETag: "v4"
413Content Too Large
リクエストボディが、サーバーが処理できる大きさを超えています。RFC 9110 より前は「Payload Too Large」と呼ばれていました。
上限を超えるアップロード(nginx の client_max_body_size、API の 10 MB 上限など)。上限が一時的なものなら Retry-After を追加します。
URL が長すぎる場合は 414、ヘッダーが大きすぎる場合は 431 を使います。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 413 Content Too Large Connection: close
414URI Too Longデフォルトでキャッシュ可能
リクエスト対象(URL)が、サーバーが解釈できる長さを超えています。
巨大なクエリ文字列。POST にすべき GET フォームや、パラメーターを追加し続けるリダイレクトループが原因であることがよくあります。
上限をどこまでも引き上げるのではなく、大きな入力はリクエストボディ(POST)に移しましょう。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 414 URI Too Long
415Unsupported Media Type
ボディの形式(Content-Type または Content-Encoding)に対応していないため、サーバーはリクエストを拒否しています。
JSON を受け付けるエンドポイントがフォームデータや XML を受け取った場合や、Content-Type ヘッダーがない場合。Accept-Post または Accept-Patch を含めて、対応形式を示しましょう。
形式は正しいが内容が不正なボディには使いません(400 または 422)。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 415 Unsupported Media Type Accept-Post: application/json
416Range Not Satisfiable
Range ヘッダーのバイト範囲がリソースとまったく重なりません。たとえばファイルの終端を超えるバイトを要求した場合です。
ファイルが小さくなった後の再開ダウンロードや、クライアントが終端を超えて要求した場合。Content-Range: bytes */<length> を含めます。
サーバーは不正な Range を単に無視して、ボディ全体とともに 200 を返すこともでき、それも認められています。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 416 Range Not Satisfiable Content-Range: bytes */47022
417Expectation Failed
サーバーは、リクエストの Expect ヘッダーの要件を満たせません。
クライアントが「Expect: 100-continue」に対応していないサーバーやプロキシに送った場合や、未知の期待値を送った場合。
このコードを受け取ったクライアントは、Expect ヘッダーなしで再試行すべきです。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 417 Expectation Failed
418(Unused)
418 が「I’m a teapot」というジョークコードとして広く使われていたため、RFC 9110 で予約されています。HTTP での意味は定められていません。
予約済み。1998 年のエイプリルフール RFC 2324(HTCPCP)の「I’m a teapot」として有名です。
イースターエッグとしてのみ。一部のサービスは、拒否したいリクエストにユーモラスに応答するために使います。
実際のエラーには使わないでください。意味を割り当てることができず、クライアントはどう対処すべきかわかりません。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 418 I'm a teapot
419Page Expired非公式 · Laravel
CSRF トークンがない、または期限切れのときに Laravel が返します。通常は、フォームのあるページでセッションがタイムアウトした後に発生します。
Laravel の CSRF ミドルウェアが送信します。ページを再読み込みする、フォームに @csrf を含める、AJAX リクエストで X-CSRF-TOKEN ヘッダーを送る、のいずれかで解決します。
標準のコードではありません。Laravel 以外の API から送らないでください。
該当なし
Laravel(IANA レジストリには未登録)
HTTP/1.1 419 unknown status
420Enhance Your Calm非公式 · Twitter(旧)
旧 Twitter API のレート制限レスポンスで、現在は標準の 429 に置き換えられています。
新規の用途はありません。古いクライアントライブラリで見かけることがあります。Spring はかつて 420「Method Failure」を定義していましたが、現在は非推奨です。
レート制限には 429 を使います。
該当なし
Twitter API v1(IANA レジストリには未登録)
HTTP/1.1 420 Enhance Your Calm
421Misdirected Request
リクエストが、そのホストとスキームに対するレスポンスを生成できないサーバーに届きました。
HTTP/2 の接続の統合がうまくいかなかった場合:ブラウザが同じ証明書でカバーされる別のホスト名に接続を再利用したものの、サーバーがそのホストを提供していない場合です。クライアントは新しい接続で再試行すべきです。
単一サーバー上の通常の未知のホスト名には使いません。その場合は通常 404 か、デフォルトのバーチャルホストになります。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/2 421
422Unprocessable Content
リクエストは正しい形式で対応形式でもありますが、内容がバリデーションに通りません。RFC 4918 では「Unprocessable Entity」と呼ばれていました。
フォームや API のバリデーションエラー:メールアドレスになっていないメール、開始日より前の終了日など。Rails、Laravel、FastAPI はデフォルトでこれを使います。
構文の誤り(解析できない JSON)には 400 を使います。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 422 Unprocessable Content
Content-Type: application/json
{"errors": {"email": ["is invalid"]}}423Locked
リソースがロックされているため、リクエストで変更できません。
WebDAV
WebDAV の LOCK のセマンティクス。一部の API は、他の人が編集中のレコードや、ログイン失敗でロックされたアカウントに使います。
WebDAV 以外では、汎用クライアントには 409 のほうが理解されやすいです。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 423 Locked
424Failed Dependency
依存していた別の操作が失敗したため、この操作も失敗しました。
WebDAV
WebDAV の PROPPATCH やバッチリクエストで、先の項目が失敗したために試行されなかった項目。
上流サービスの障害には使いません。それらは 502 または 503 です。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 424 Failed Dependency
425Too Early
TLS 1.3 のアーリーデータ(0-RTT)で送られたリクエストは、リプレイされる可能性があるため、サーバーは処理しません。
0-RTT を受け付けるものの、アーリーデータ内の非冪等なリクエスト(POST)を拒否する CDN やサーバー。クライアントはハンドシェイク完了後に再試行します。
一般的な「後で再試行」のコードではありません。その場合は Retry-After 付きの 503 を使います。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 425 Too Early
426Upgrade Required
サーバーは現在のプロトコルでのリクエストを拒否していますが、Upgrade ヘッダーで指定したプロトコルにアップグレードすれば受け付けます。
TLS や新しいプロトコルを必須とする場合や、WebSocket エンドポイントに通常の HTTP リクエストが来た場合。Upgrade ヘッダーを含める必要があります。
Web サイトの HTTP から HTTPS への移行には、301 または 308 のリダイレクトと HSTS を組み合わせるのが一般的です。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 426 Upgrade Required Upgrade: TLS/1.3, HTTP/1.1 Connection: Upgrade
428Precondition Required
更新の消失を防ぐため、サーバーはリクエストが条件付き(If-Match など)であることを要求しています。
PUT、PATCH、DELETE の前に、最後に確認した ETag を If-Match で送るようクライアントに求める API。
前提条件が送られて失敗した場合は 412 を使います。428 は何も送られなかった場合のためのものです。
キャッシュに保存してはならない
HTTP/1.1 428 Precondition Required
Content-Type: application/json
{"error": "Send If-Match with the current ETag"}429Too Many Requests
クライアントが一定時間内に送ったリクエストが多すぎます(レート制限)。
API のレート制限、ログイン試行の制限、スクレイピング対策。行儀のよいクライアントがいつ再試行すればよいかわかるよう Retry-After を含めましょう。RateLimit ヘッダーも役立ちます。
サーバーが全員に対して過負荷になっている場合は 503 を使います。Googlebot は 429 を 503 と同様に扱い、クロールの速度を落とします。
キャッシュに保存してはならない
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json
{"error": "Rate limit exceeded: 100 requests per minute"}431Request Header Fields Too Large
ヘッダーが、個別に、または合計で、サーバーにとって大きすぎます。
たいていは、ドメインに蓄積した大きすぎる Cookie や巨大な Authorization トークンが原因です。ユーザー側では Cookie を削除すると解決することがよくあります。
URL が長い場合は 414、ボディが大きい場合は 413 を使います。
キャッシュに保存してはならない
HTTP/1.1 431 Request Header Fields Too Large
440Login Time-out非公式 · Microsoft IIS / Exchange
クライアントのセッションが期限切れになり、再ログインが必要です(Outlook Web Access など IIS のアプリ)。
Exchange/OWA 環境で見られます。
自分のアプリでのセッション切れには 401 を使います。
該当なし
Microsoft IIS(IANA レジストリには未登録)
HTTP/1.1 440 Login Time-out
444No Response非公式 · nginx
nginx 内部のコード:「return 444;」で、レスポンスを一切送らずに接続を閉じます。
スキャナーからのリクエスト、デフォルトの server ブロックでの未知の Host ヘッダーへのリクエスト、悪質なクライアントの遮断。nginx のログに記録され、クライアントには空の応答が返ります。
クライアントが 444 を受け取ることはないので、クライアントコードで処理するものではありません。
該当なし
nginx(IANA レジストリには未登録)
server {
listen 80 default_server;
return 444;
}449Retry With非公式 · Microsoft
Microsoft の拡張:クライアントが特定の操作を行った後にリクエストを再試行すべきことを示します。
一部の Microsoft サービスで見られます(Exchange ActiveSync。Azure Cosmos DB は再試行可能な書き込み競合に 449 を使います)。
標準ではありません。自分の API では 409、または Retry-After 付きの 503 を使います。
該当なし
Microsoft IIS(IANA レジストリには未登録)
HTTP/1.1 449 Retry With
450Blocked by Windows Parental Controls非公式 · Microsoft
Windows の保護者による制限でページへのアクセスがブロックされました。
保護者による制限が有効な Windows システムで生成されます。
サーバーから送信しないでください。
該当なし
Microsoft(IANA レジストリには未登録)
HTTP/1.1 450 Blocked by Windows Parental Controls
451Unavailable For Legal Reasonsデフォルトでキャッシュ可能
法的な要請(裁判所の命令、政府による検閲、法的理由による地域制限)のため、アクセスが拒否されています。
特定の法域でブロックされたコンテンツ(制裁、GDPR 関連の地域ブロック、削除命令)。rel="blocked-by" 付きの Link ヘッダーで、誰がブロックを課したかを示せます。
通常の権限拒否(403)や、単に自分で削除すると決めたコンテンツ(410)には使いません。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 451 Unavailable For Legal Reasons Link: <https://authority.example/>; rel="blocked-by"
460Client closed connection (AWS ELB)非公式 · AWS Application Load Balancer
アイドルタイムアウトが経過する前にクライアントが接続を閉じた場合に、AWS ALB が記録します。
ALB のアクセスログで見られます。たいていは、ターゲットの処理時間よりタイムアウトが短いクライアントです。
クライアントには送信されません。
該当なし
AWS Elastic Load Balancing(IANA レジストリには未登録)
elb_status_code=460
463Too many IPs in X-Forwarded-For (AWS ELB)非公式 · AWS Application Load Balancer
ALB が 30 個を超える IP アドレスを含む X-Forwarded-For ヘッダーを受け取りました。
たいていは、アドレスを追加し続けるプロキシのループです。
アプリケーションで使うものではありません。
該当なし
AWS Elastic Load Balancing(IANA レジストリには未登録)
HTTP/1.1 463
494Request Header Too Large非公式 · nginx
ヘッダーが large_client_header_buffers を超えた場合の nginx 内部のコードです。クライアントには 400 が返ります。
nginx のログや error_page の設定で使われます。
標準のコードは 431 です。
該当なし
nginx(IANA レジストリには未登録)
error_page 494 /header-too-large.html;
495SSL Certificate Error非公式 · nginx
nginx 内部:クライアントが無効なクライアント証明書を提示しました(相互 TLS)。クライアントには 400 として送られます。
mTLS の失敗時のカスタムエラーページ。
実際に送受信されるステータスコードではありません。
該当なし
nginx(IANA レジストリには未登録)
error_page 495 /bad-client-cert.html;
496SSL Certificate Required非公式 · nginx
nginx 内部:クライアント証明書が必要なのに提示されませんでした。クライアントには 400 として送られます。
ssl_verify_client が有効な場合のカスタムエラーページ。
実際に送受信されるステータスコードではありません。
該当なし
nginx(IANA レジストリには未登録)
error_page 496 /client-cert-required.html;
497HTTP Request Sent to HTTPS Port非公式 · nginx
nginx 内部:TLS を想定したポートに通常の HTTP リクエストが届きました。クライアントには 400 として送られます。
よく使われる手法は「error_page 497 =301 https://$host$request_uri;」で、こうしたリクエストを HTTPS にリダイレクトします。
実際に送受信されるステータスコードではありません。
該当なし
nginx(IANA レジストリには未登録)
error_page 497 =301 https://$host:$server_port$request_uri;
498Invalid Token非公式 · Esri ArcGIS Server
期限切れ、またはその他の理由で無効なトークンに対して ArcGIS が返します。
ArcGIS のサービスを呼び出す場合にのみ関係します。
自分の API での無効なトークンには 401 を使います。
該当なし
Esri ArcGIS(IANA レジストリには未登録)
HTTP/1.1 498 Invalid Token
499Client Closed Request非公式 · nginx
nginx がレスポンスを送る前にクライアントが接続を閉じた場合に、nginx が 499 を記録します。
アクセスログで見られます:ユーザーがページを離れた、モバイルクライアントがタイムアウトした、nginx の前にあるロードバランサーのタイムアウトが短いなど。特定のエンドポイントで 499 が多い場合、たいていは処理が遅すぎることを意味します。
クライアントが受け取ることはありません。Esri も 499 を「Token Required」に使っています。
該当なし
nginx(IANA レジストリには未登録)
203.0.113.9 - - [16/Oct/2026:10:12:01 +0000] "GET /report HTTP/1.1" 499 0
5xx サーバーエラー
500Internal Server Error
サーバーで予期しない状況が発生し、リクエストを処理できませんでした。
未処理の例外やバグ。より具体的な 5xx が当てはまらない場合の汎用的なフォールバックです。
クライアントの誤り(4xx)には使わないでください。本番環境ではボディにスタックトレースを含めず、ログに記録しましょう。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 500 Internal Server Error
Content-Type: application/problem+json
{"title": "Internal Server Error", "traceId": "4bf92f35"}501Not Implementedデフォルトでキャッシュ可能
サーバーは必要な機能に対応していません。典型的には、まったく認識しない HTTP メソッドです。
未知のメソッドによるリクエスト(通常の Web サーバーへの WebDAV メソッドなど)や、サーバーが意図的にまだ実装していない機能。
メソッドは認識しているが、その URL では許可されていない場合は 405 を使います。
デフォルトでキャッシュ可能(ヒューリスティックにキャッシュ可能)
HTTP/1.1 501 Not Implemented
502Bad Gateway
ゲートウェイまたはプロキシが、上流サーバーから不正なレスポンスを受け取りました。
アプリケーションサーバーがクラッシュした、接続を閉じた、不正なデータを返したときに、リバースプロキシやロードバランサー(nginx、Cloudflare、AWS ALB)が送信します。
アプリケーションコードから送る必要はほとんどありません。例外は、呼び出した別のサービスが失敗した API ゲートウェイです。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 502 Bad Gateway Server: nginx
503Service Unavailable
サーバーは現在リクエストを処理できません(過負荷またはメンテナンス中)。一時的な状態であることが想定されています。
計画メンテナンス、負荷の抑制、依存サービスの障害。Retry-After を追加しましょう。短期間の 503 なら、検索エンジンはページをインデックスに残します(200 のメンテナンスページや 404 とは異なります)。
サイトを何日も 503 のままにしないでください。返し続ける URL は、Google が最終的にインデックスから削除します。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 503 Service Unavailable Retry-After: 3600
504Gateway Timeout
ゲートウェイまたはプロキシが、上流サーバーから時間内にレスポンスを受け取れませんでした。
アプリケーションの処理がプロキシのタイムアウトより長くかかったときに、プロキシやロードバランサーが送信します(nginx の proxy_read_timeout のデフォルトは 60 秒)。
時間のかかるジョブでは、単にタイムアウトを延ばすのではなく、202 を返して非同期で処理しましょう。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 504 Gateway Timeout Server: awselb/2.0
505HTTP Version Not Supported
サーバーは、リクエストで使われた HTTP のメジャーバージョンに対応していません。
サーバーが扱えないプロトコルバージョンを受け取った場合。
ほとんど見かけません。クライアントは試行錯誤ではなく、ALPN と Alt-Svc で HTTP/2 や HTTP/3 をネゴシエートします。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 505 HTTP Version Not Supported
506Variant Also Negotiates
サーバーの設定エラー:選ばれたバリアント自体がネゴシエーションを行うよう設定されており、ループが発生しています。
透過的コンテンツネゴシエーション(実験的)
RFC 2295 の透過的コンテンツネゴシエーションを実装したサーバーのみ。
アプリケーションのエラーには使いません。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 506 Variant Also Negotiates
507Insufficient Storage
サーバーは、リクエストの完了に必要なデータを保存できません。
WebDAV
ディスクやユーザーの容量が一杯になったときの WebDAV やファイルストレージ API。
1 回のアップロードがサイズ上限を超える場合は、413 のほうが明確です。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 507 Insufficient Storage
508Loop Detected
無限ループ(Depth: infinity の WebDAV バインディング)を検出したため、サーバーが操作を停止しました。
WebDAV
WebDAV サーバー。CloudLinux ベースの共有ホスティングでも、アカウントが上限に達したときに 508「Resource Limit Is Reached」を送りますが、これは非標準です。
リダイレクトループには使いません。それはブラウザ自身が報告するクライアント側のエラーです。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 508 Loop Detected
509Bandwidth Limit Exceeded非公式 · Apache bw_mod / cPanel
ホスティングアカウントが帯域幅の割り当てを超えました。
共有ホスティングのコントロールパネル。
自分のシステムでは 503 または 429 を使います。
該当なし
Apache / cPanel(IANA レジストリには未登録)
HTTP/1.1 509 Bandwidth Limit Exceeded
510Not Extended非推奨
リクエストが、HTTP 拡張フレームワークにおけるリソースへのアクセスポリシーを満たしていません。
IANA レジストリで廃止扱い:RFC 2774 は Historic に移されました。
現在の用途はありません。拡張フレームワークは広く実装されることはありませんでした。
送信しないでください。
明示的な Cache-Control または Expires がある場合のみキャッシュ可能
HTTP/1.1 510 Not Extended
511Network Authentication Required
ネットワークにアクセスするには、クライアントの認証が必要です(キャプティブポータル)。
ホテル、空港、カフェの Wi-Fi ポータルが、ユーザーがログインするか利用規約に同意するまで通信を横取りする場合。
オリジンサーバーが送信してはいけません。通信を横取りするネットワークプロキシ専用です。
キャッシュに保存してはならない
HTTP/1.1 511 Network Authentication Required Content-Type: text/html <meta http-equiv="refresh" content="0; url=https://login.example.net/">
520Web Server Returned an Unknown Error非公式 · Cloudflare
オリジンが Cloudflare に空、不明、または予期しないレスポンスを返しました。
オリジンのログを確認してください:クラッシュ、接続のリセット、Cloudflare の上限を超えるヘッダー、空の応答など。
Cloudflare のみが送信します。
該当なし
Cloudflare(IANA レジストリには未登録)
HTTP/2 520 server: cloudflare
521Web Server Is Down非公式 · Cloudflare
Cloudflare がオリジンに接続できませんでした:接続が拒否されました。
オリジンの Web サーバーが停止しているか、ファイアウォールが Cloudflare の IP 範囲をブロックしています。
Cloudflare のみが送信します。
該当なし
Cloudflare(IANA レジストリには未登録)
HTTP/2 521 server: cloudflare
522Connection Timed Out非公式 · Cloudflare
Cloudflare がオリジンとの TCP 接続の確立中にタイムアウトしました。
オリジンの過負荷、ファイアウォールによるパケットの破棄、DNS のオリジン IP の誤り。
Cloudflare のみが送信します。
該当なし
Cloudflare(IANA レジストリには未登録)
HTTP/2 522 server: cloudflare
523Origin Is Unreachable非公式 · Cloudflare
Cloudflare がオリジンにまったく到達できません。典型的にはルーティングの問題か DNS レコードの誤りです。
DNS の A/AAAA レコードが、到達可能な正しい IP を指しているか確認してください。
Cloudflare のみが送信します。
該当なし
Cloudflare(IANA レジストリには未登録)
HTTP/2 523 server: cloudflare
524A Timeout Occurred非公式 · Cloudflare
Cloudflare はオリジンに接続しましたが、オリジンがタイムアウト(デフォルトは 100 秒)内に HTTP レスポンスを返しませんでした。
時間のかかるリクエスト:処理をバックグラウンドジョブに移してポーリングするか、進行状況をストリーミングしましょう。
Cloudflare のみが送信します。
該当なし
Cloudflare(IANA レジストリには未登録)
HTTP/2 524 server: cloudflare
525SSL Handshake Failed非公式 · Cloudflare
Cloudflare とオリジンの間の TLS ハンドシェイクが失敗しました。
SSL モードが Full または Full (strict) のときに、オリジンが 443 で待ち受けていない、証明書がない、共通の暗号スイートがない、SNI が設定されていないなど。
Cloudflare のみが送信します。
該当なし
Cloudflare(IANA レジストリには未登録)
HTTP/2 525 server: cloudflare
526Invalid SSL Certificate非公式 · Cloudflare
Full (strict) モードで、Cloudflare がオリジンの証明書を検証できませんでした(期限切れ、自己署名、ホスト名の不一致)。
オリジンに有効な証明書か、Cloudflare Origin CA 証明書をインストールしてください。
Cloudflare のみが送信します。
該当なし
Cloudflare(IANA レジストリには未登録)
HTTP/2 526 server: cloudflare
527Railgun Error非公式 · Cloudflare(廃止)非推奨
Cloudflare とオリジンの Railgun リスナーとの間の接続の問題です。Cloudflare は Railgun の提供を終了しています。
過去のものです。
送信していたのは Cloudflare のみです。
該当なし
Cloudflare(IANA レジストリには未登録)
HTTP/1.1 527 Railgun Error
530Origin DNS / 1xxx error非公式 · Cloudflare
Cloudflare の 1xxx エラーページ(1016 Origin DNS error など)とともに返されます。ページに表示される 1xxx のコードが本当の原因です。
ページに表示された 1xxx のエラー番号を調べてください。
CDN やホスティング事業者のみが送信します。
該当なし
Cloudflare(IANA レジストリには未登録)
HTTP/2 530 server: cloudflare
561Unauthorized (AWS ELB)非公式 · AWS Application Load Balancer
ALB の組み込み認証(OIDC または Cognito)が ID プロバイダーとの間で失敗しました。
ALB リスナールールの IdP の設定を確認してください。
アプリケーションで使うものではありません。
該当なし
AWS Elastic Load Balancing(IANA レジストリには未登録)
HTTP/1.1 561
598Network Read Timeout Error非公式 · 一部の HTTP プロキシ
一部のプロキシが、プロキシの背後での読み取りタイムアウトを示すために使います。
まれ。特定のプロキシ製品で見かけることがあります。
504 を使います。
該当なし
Informal convention(IANA レジストリには未登録)
HTTP/1.1 598
599Network Connect Timeout Error非公式 · 一部の HTTP プロキシとクライアント
一部のプロキシやクライアントライブラリ(Tornado の HTTP クライアントなど)が、接続タイムアウトに使います。
まれ。
プロキシでは 504 を使います。
該当なし
Informal convention(IANA レジストリには未登録)
HTTP/1.1 599
ブラウザ内で動作する静的なリファレンスです。検索内容がどこかに送信されることはありません。 すべての無料ツールを見る.
不具合や改善できそうな点を見つけましたか?いただいたメッセージはすべて読み、すぐに対応します。
この HTTP ステータスコード一覧は、100 Continue から 511 Network Authentication Required まで、IANA レジストリにあるすべてのコードを網羅し、意味、使うべき場面と使うべきでない場面、キャッシュが保存してよいか、定義元の RFC セクションを掲載しています。番号、4xx のようなクラス、「redirect」や「rate limit」のような単語を入力して絞り込めるほか、#404 や #503 のようなアンカーで任意のコードに直接リンクできます。
公式の項目は RFC 9110(2022 年)に従っています。RFC 9110 は RFC 7231 に代わるもので、いくつかのコードの名称が変わりました。413 は Content Too Large に、422 は Unprocessable Content になっています。nginx の 499 や Cloudflare の 522 のように、ログでは見かけてもレジストリにはないコードも、送信するシステム名とともに非公式と明記して掲載しています。これはリファレンスであってモニターではありません。URL を取得したり、稼働中のサイトがどのステータスを返すかを確認したりはしません。
使い方
- 検索ボックスにコード(503)、クラス(4xx)、キーワード(timeout、redirect、cache)を入力します。入力に合わせて結果が絞り込まれます。
- クラスのボタンで 1xx、2xx、3xx、4xx、5xx のコードだけを表示し、「非公式のコードを含める」のチェックを外すとベンダー固有のコードを非表示にできます。
- コードをクリックすると展開されます。意味、使うべき場面と使うべきでない場面、キャッシュの挙動、定義元の RFC、レスポンスの例が表示されます。
- 「このコードへのリンクをコピー」で、/tools/http-status-codes#429 のような直接リンクを共有できます。
よくある質問
401 と 403 の違いは何ですか?
401 Unauthorized は、リクエストに有効な認証情報がないことを意味します。クライアントがログインしていないか、トークンの期限が切れています。サーバーは認証方法を示す WWW-Authenticate ヘッダーを送る必要があります。403 Forbidden は、サーバーがクライアントが誰かを把握している(あるいはその必要がない)うえで、それでも拒否していることを意味し、ログインし直しても解決しません。要するに、401 は「あなたは誰?」、403 は「わかっているけど、ダメ」です。
恒久的なリダイレクトには 301 と 308 のどちらを使うべきですか?
どちらも恒久的なリダイレクトで、どちらも Google でランキングシグナルを引き継ぎます。違いはメソッドです。301 に従うとき、ブラウザは POST を GET に変えることがありますが、308 ではクライアントが同じメソッドと本文で繰り返す必要があります。通常のページ移転なら 301 で問題ありませんが、POST や PUT を受け付ける API エンドポイントには 308 を使ってください。一時的なリダイレクトにも同じ組み合わせがあり、302 はメソッドを変えてもよく、307 は変えてはいけません。
nginx のログにある 499 はどういう意味ですか?
499 Client Closed Request は nginx 独自のコードです。nginx がレスポンスを送る前にクライアントが接続を閉じたときに記録されるので、クライアントが実際に 499 を受け取ることはありません。たまに出る 499 はユーザーがページを離れただけですが、1 つのエンドポイントで多発している場合は、たいていそのエンドポイントが遅すぎて、クライアントや上流のロードバランサーが先にタイムアウトしています。
502、503、504 の違いは何ですか?
3 つとも、別のサーバーの前段にあるサーバーから返されます。502 Bad Gateway は、プロキシが上流のアプリから不正なレスポンスを受け取ったか、接続が切れたことを意味します。503 Service Unavailable は、サーバーが一時的にリクエストを処理できない状態で、通常は過負荷かメンテナンスが原因です。Retry-After を含めるべきです。504 Gateway Timeout は、プロキシが上流の応答を待ちきれずにあきらめたことを意味します。
418 I'm a teapot は本当にあるステータスコードですか?
RFC 2324(1998 年)のエイプリルフールのジョークとして始まりましたが、実装したソフトウェアが多かったため、現在 RFC 9110 では 418 を「(Unused)」として掲載しています。本当の意味が与えられることのないよう予約されているのです。実際の問題に対して送るべきエラーではありませんが、イースターエッグとして残しておくのは問題ありません。
デフォルトでキャッシュできるステータスコードは?
RFC 9110 は 200、203、204、206、300、301、308、404、405、410、414、501 をヒューリスティックにキャッシュ可能としています。つまり、Cache-Control や Expires がなくてもキャッシュが保存してよいということです。RFC 7725 で 451 が追加されています。302 や 307 を含むほかのコードは、レスポンスに明示的な鮮度情報がある場合にのみキャッシュされ、RFC 6585 は 428、429、431、511 を一切保存してはならないとしています。
5 つのクラスの概要
• 1xx 情報:最終的なレスポンスの前に返される中間レスポンス。直接扱うことはまれで、実務で重要なのは 101(WebSocket へのアップグレード)と 103(Early Hints)です。
• 2xx 成功:リクエストは成功しました。通常のレスポンスには 200、何かが作成されたときは 201(Location ヘッダー付き)、意図的に本文がないときは 204。
• 3xx リダイレクト:クライアントは別の場所を参照する必要があります。恒久的な移転には 301/308、一時的な移転には 302/307、フォームの POST の後には 303、キャッシュされたコピーがまだ有効なときは 304。
• 4xx クライアントエラー:リクエストが誤っており、そのまま繰り返しても再び失敗します。400 は不正な形式、401 は未認証、403 は許可なし、404 は見つからない、409 は競合、422 は検証失敗、429 はレート制限。
• 5xx サーバーエラー:リクエストは正しくても、サーバーが失敗しました。500 はバグ、502/504 はプロキシから上流への接続の失敗、503 は一時的な利用不可。
API で適切なコードを選ぶ
汎用的なクライアントが対処できる最も具体的なコードを返し、詳細は本文に入れましょう。リトライする HTTP クライアント、CDN、監視システムは JSON を読まなくても 429 や 503 の意味がわかりますが、{"error": true} 付きの 200 は解釈できません。RFC 9457(Problem Details)は、エラー本文の標準的な JSON の形を定めています。
ほとんどの JSON API で実用的な対応付けは次のとおりです。解析できない入力には 400、形式は正しいが検証に失敗した入力には 422、トークンがないか期限切れなら 401、ユーザーに権限がなければ 403、不明な ID には 404(ユーザーが見てはいけないリソースを隠す場合も)、重複やバージョンの競合には 409、If-Match の ETag が古ければ 412、レート制限には Retry-After 付きの 429、計画的なダウンタイムには Retry-After 付きの 503。
新しい番号を作らないでください。クライアントは未知のコードをそのクラスの x00 として扱う(未知の 4xx は 400 と同様に扱われる)ので、独自の 461 を使っても、400 とわかりやすいメッセージ以上のメリットはありません。
ステータスコードと SEO
検索エンジンはステータスコードを文字どおりに読みます。301 や 308 は古い URL のシグナルを新しい URL に引き継ぎ、302 や 307 は古い URL をインデックスに残すよう Google に伝えます。404 と 410 はどちらも時間とともにページをインデックスから削除します。「見つかりません」と表示する 200 のページはソフト 404 で、Google はこれを検出して Search Console で報告します。メンテナンス時は、Retry-After 付きの 503 を短期間返せば順位は保たれますが、200 の「まもなく再開します」ページは検索結果でコンテンツと置き換わってしまうことがあります。また、Googlebot は 429、500、503 を受け取るとクロール頻度を下げます。
関連する無料ツール
- ユーザーエージェント解析 — 自分のユーザーエージェントとクライアントヒントを確認したり、任意の UA 文字列をブラウザ、エンジン、OS、デバイス、CPU に分解したりできます。CSV 対応の一括モード付き。
- JSON 整形 — JSON を整形、圧縮(minify)、検証し、解析エラーは行と列で位置を示します。ブラウザ上で動作、アップロード不要。
- docker run ⇄ Compose 変換 — docker run コマンドを docker-compose.yml のサービスに、Compose のサービスを docker run に変換します。
- 正規表現テスター — サンプルテキストに対して正規表現をテストし、マッチのハイライト、キャプチャグループ、置換のプレビューをリアルタイムで確認。無料、ブラウザ上で動作。