⌘K でツールを切替
NETWORK · HTTP

HTTPステータスコードリファレンス

HTTPステータスコードを説明付きで閲覧します。

local
http-status
CodeNameClassMeaning
100ContinueInformationalThe client should continue with its request.
101Switching ProtocolsInformationalThe server is switching protocols as requested.
200OKSuccessThe request succeeded.
201CreatedSuccessThe request succeeded and a new resource was created.
202AcceptedSuccessThe request was accepted but not yet processed.
204No ContentSuccessSuccess, but there is no content to return.
206Partial ContentSuccessThe server delivered part of the resource (range request).
301Moved PermanentlyRedirectionThe resource has permanently moved to a new URL.
302FoundRedirectionThe resource is temporarily at a different URL.
304Not ModifiedRedirectionThe cached version is still valid.
307Temporary RedirectRedirectionTemporary redirect that preserves the method.
308Permanent RedirectRedirectionPermanent redirect that preserves the method.
400Bad RequestClient ErrorThe server could not understand the request.
401UnauthorizedClient ErrorAuthentication is required and has failed or not been provided.
403ForbiddenClient ErrorThe server understood but refuses to authorize the request.
404Not FoundClient ErrorThe requested resource could not be found.
405Method Not AllowedClient ErrorThe HTTP method is not supported for this resource.
408Request TimeoutClient ErrorThe server timed out waiting for the request.
409ConflictClient ErrorThe request conflicts with the current state of the resource.
410GoneClient ErrorThe resource is permanently gone.
418I'm a teapotClient ErrorAn April Fools joke from RFC 2324.
422Unprocessable EntityClient ErrorThe request was well-formed but semantically invalid.
429Too Many RequestsClient ErrorThe client has sent too many requests (rate limited).
500Internal Server ErrorServer ErrorA generic server-side error occurred.
501Not ImplementedServer ErrorThe server does not support the requested functionality.
502Bad GatewayServer ErrorAn upstream server returned an invalid response.
503Service UnavailableServer ErrorThe server is temporarily overloaded or down.
504Gateway TimeoutServer ErrorAn upstream server did not respond in time.
§01 このツールについて

概要

ステータスコードはサーバーによる「何が起きたか」の一語の要約で、誤ったものを 選ぶと、整理の良し悪しをはるかに超えた結果を招きます。クライアントが再試行するか、 キャッシュが保存するか、クローラーがその URL を保持し続けるか、プロキシが リクエストを再処理するかが変わるのです。

これは実際に出会うコードを検索できる参照表で、仕様の言い換えではなく実務上の 使い分けを添えています。

使い方

番号(404)または名称の一部(gateway)を入力すると一覧が絞り込まれます。 両方のフィールドで照合するので、too many429 は同じ項目に行き着きます。

5 つのクラス

クラス意味クライアントがすべきこと
1xx情報 — リクエストは進行中待ち続ける
2xx成功レスポンスを使う
3xxリダイレクト — 別の場所にある、または変更なし辿る、またはキャッシュを使う
4xxクライアントエラー — リクエスト自体が問題そのままでは再試行しない
5xxサーバーエラー — リクエストは正しかったかもしれないバックオフして再試行

実務で最も重要なのは 4xx5xx の切り分けです。再試行の挙動を決めるからです。 不正な形式のリクエストに 500 を返すサーバーは、リトライ方針を持つ全ての まともなクライアントから、その不正なリクエストを何度も何度も送られます。 400 を返せばループが止まります。

押さえておく価値のある使い分け

本文にエラーを入れた 200 — API でよく見かけ、ほぼ常に誤りです。自分と クライアントの間にあるすべての層(キャッシュ・プロキシ・監視・リトライ処理)は JSON ではなくステータスコードを読みます。200 を返すエラーは、それらすべてから 見えません。

作成時の 201200201 には新しいリソースを指す Location ヘッダを 添えるべきです。クライアントが使うのはその部分で、コード単独では大した情報を 足しません。

202 Accepted — 実行したのではなくキューに入れた作業に対する正しい答えです。 これは約束なので、クライアントがどこを確認すればよいか(状態 URL かジョブ ID)を 伝える必要があります。

204 No Content — 意図的に本文が空の成功で、典型的には DELETE か何も返さない PUT に使います。空の JSON オブジェクトではなく、本文が一切無い必要があります。

304 Not ModifiedETagLast-Modified が一致する条件付きリクエストへの 応答です。本文を持たないことがまさに要点で、クライアントは既にそのバイト列を 持っています。304 を返さない実装は、再検証のたびにリソース全体を再転送します。

400422400 はサーバーが解析できなかったリクエスト(不正な JSON、 必須パラメータの欠落)に。422 は解析は通ってバリデーションで落ちたリクエストに。 この区別は、クライアントに直すべきものが直列化なのかデータなのかを伝えます。

405 Method Not Allowed — 受け付けるメソッドを列挙した Allow ヘッダを 含めなければなりません。無ければ、クライアントは進む方法を示されずに拒否された だけになります。

409 Conflict — 現在の状態に適用できないリクエストに使います。古いバージョンに 対する編集、一意性制約に違反する重複などです。汎用の「何かがおかしい」ではありません。

410 Gone — より強い 404 で、「これは存在したが戻ってこない」という意味です。 クローラーは 410404 より速く落とすので、意図して削除したコンテンツには そちらが望ましい挙動です。

429 Too Many RequestsRetry-After が必要です。無ければクライアントは 推測し、しかも下手に推測します。通常は即座に再試行します。

502503504502 は上流が不正なレスポンスを返したという意味。 503 はこのサーバーが利用不能で、典型的には過負荷か保守中。504 は上流が 時間内に応答しなかったという意味です。3 つは別の場所を指しており、互換的に 使うと障害箇所の特定が難しくなります。

使用例

  • クローラーが削除済みページを要求し続ける404 ではなく 410 を返します。
  • クライアントが失敗するエンドポイントを叩き続ける — 実際には 4xx の状況に 対して 5xx を返していないか確認します。
  • リダイレクトの裏でフォーム送信のデータが失われる — そのリダイレクトは おそらく 301302 です。308307 に変えます。
  • CDN がレスポンスをキャッシュしない2xx3xx は既定でキャッシュ可能、 ほとんどの 4xx は不可、5xx は決してキャッシュすべきではありません。
  • API が 200 を返してクライアントが失敗を無視する — 無視しているのではなく、 何も伝えられていないのです。

注意事項

418 I'm a teapot は、登録済みで恒久的に予約されているという意味では実在します。 エイプリルフールの RFC が出典で、調べる人がいるので一覧に入っています。

レジストリ外のコードも仕様上は正当です。クライアントは未知のコードをクラスで 扱わなければならないので、独自の 299 は成功として、独自の 599 はサーバー エラーとして処理されます。ただし混乱に見合う価値があることはまずありません。

ここに載せているのは実際に使われているコードです。完全なレジストリは IANA が 管理しており、WebDAV などの拡張向けで通常の Web サービスが返さないコードも 含まれます。

稼働中の URL が実際にどのコードを返すか、リダイレクト連鎖も含めて確認するには HTTP ヘッダチェッカー を使ってください。

FAQ
何かが送信されますか?
いいえ。コード一覧はページの一部です。読み込み後はオフラインでも動き、入力したものはブラウザから出ません。
401 と 403 の違いは何ですか?
401 はリクエストが認証されていない状態です。サーバーは相手が誰か分からず、正しい資格情報を出せば答えが変わります。403 は相手が誰か分かっていて、それでも答えが「否」です。401 には認証方法を示す WWW-Authenticate ヘッダが必須で、403 には差し出せるものが何もありません。
403 ではなく 404 を使うべきなのはどんな場合ですか?
リソースの存在を認めること自体が情報漏洩になる場合です。/users/42 に 403 を返すことは、攻撃者に利用者 42 の存在を伝えます。404 は伝えません。これは意図的な虚偽であり、認可に敏感なリソースでは正しい選択です。
メソッドを保持するリダイレクトはどれですか?
307 と 308 です。クライアントは歴史的に 301 と 302 を辿るとき POST を GET に変えており、その挙動は今も広く残っているので、POST が絡む可能性があるなら恒久的な移動は 308、一時的な移動は 307 を使ってください。
429 と 503 は同じですか?
違います。429 はこのクライアントが送りすぎているので速度を落とすべきという意味です。503 はサーバー全体が今どのクライアントにも応答できないという意味です。どちらも Retry-After を伴うべきで、混同するとクライアントのバックオフが誤動作します。