IANAレジストリに登録された標準のHTTPレスポンスステータスコードを、<code>100 Continue</code>から<code>511 Network Authentication Required</code>まで検索できるリファレンスです。各コードには、わかりやすい説明、サーバーやAPIがいつ返すべきかのアドバイス、併せて使うレスポンスヘッダー、定義しているRFCへのリンクが付いています。よく見かける非公式コード(nginxの<code>499</code>、Laravelの<code>419</code>、Cloudflareの<code>520</code>–<code>526</code>)も、はっきり区別して収録しています。番号、名前、または「redirect」「rate limit」のようなキーワードで検索できます。
ステータスコードの調べ方
- 1コード(
404)、その先頭部分(40)、クラス(4xx)、名前(teapot)、またはキーワード(rate limit、cache、Retry-After)を入力します。 - 21xx–5xxのフィルターで1つのクラスに絞り込んだり、非公式コードを非表示にしたりできます。
- 3マウスまたは矢印キーでコードを選ぶと、意味、使いどころ、関連ヘッダー、仕様が表示されます。
- 4コードやステータスライン全体をコピーしたり、ページのURLを共有したりできます。URLは
#404で終わり、そのコードが開いた状態で表示されます。
ステータスコードの5つのクラス
クライアントは認識できないコードを受け取ると、そのクラスのx00コードとして扱います。つまり未知の499は400として、未知の299は200として処理されます。そのため、新しいコードを追加しても古いソフトウェアが壊れることはありません。
- 1xx 情報
- 最終レスポンスの前に送られる暫定レスポンス:100 Continue、WebSocket用の101 Switching Protocols、プリロード用の103 Early Hints。
- 2xx 成功
- リクエストは成功しました。200 OKが基本で、201 Createdや204 No Contentは何が起きたかをより正確に伝えます。
- 3xx リダイレクト
- クライアントは別の場所、通常はLocationヘッダーのURLを参照する必要があります。304 Not Modifiedの場合はキャッシュを使います。
- 4xx クライアントエラー
- リクエストに問題があります:形式の誤り、未認証、禁止、存在しないリソースへのアクセス、または頻度の超過。そのまま再送しても解決しません。
- 5xx サーバーエラー
- リクエストは正しかったかもしれませんが、サーバーやその背後のシステムが失敗しました。一時的なことが多く、間隔を空けて(バックオフ)再試行する価値があります。
APIに適したコードの選び方
ほとんどのAPIで必要なコードは十数個程度です。成功時:ボディ付きなら200、何かを作成したらLocationヘッダー付きで201、処理が後で行われるなら202、返すものがなければ204。クライアントエラー:形式が不正なリクエストには400、形式は正しいが検証に失敗したデータには422、認証情報がない・無効なら401、有効だが権限が足りなければ403、存在しないリソースには404、メールアドレスの重複などの競合には409、レート制限には429。サーバーエラー:バグには500、間にあるインフラの障害には502、503、504。
どのコードでも、内容を説明するボディを返しましょう。RFC 9457「Problem Details」(application/problem+json)は、type、title、status、detailフィールドを持つ標準形式を定めています。ボディにエラーを入れて200を返すのは厳禁です。キャッシュ、監視、リトライ処理はJSONではなくステータスコードを見ています。こうしたボディの整形にはJSON整形ツールを使ってください。
混同しやすいコード
- 401 vs 403
- 401 Unauthorizedは「あなたが誰かわからない」という意味で、ログインするか有効なトークンを送る必要があります。403 Forbiddenは「あなたが誰かはわかるが、これはできない」という意味です。
- 301 vs 302 vs 307 vs 308
- 301と308は恒久的で、検索順位の評価を新しいURLに引き継ぎます。302と307は一時的です。307と308はメソッドとボディが維持されることを保証しますが、301と302ではブラウザがPOSTをGETに変えてしまいます。
- 400 vs 422
- 400はサーバーがまったく解析できないリクエスト用、422は必須フィールドの欠落など、JSONとしては正しいが内容がルールに反する場合に使います。
- 404 vs 410
- 404は「今ここには何もない」、410は「以前はあったが意図的に削除された」という意味で、検索エンジンからより早く削除されます。
- 502 vs 504
- どちらもプロキシやロードバランサーが返します。502はアップストリームが不正な応答を返したか接続を切ったこと、504は時間内に応答しなかったことを意味します。
- 500 vs 503
- 500は予期しない障害で、たいていはバグです。503はメンテナンスや過負荷など既知の一時的な状態で、Retry-Afterを付けるべきです。
ステータスコードとSEO
検索エンジンはステータスコードをよく見ています。ページを恒久的に移転する場合は301か308を使えば、検索順位の評価も一緒に移ります。302は、引き続き古いURLをインデックスすべきだと伝えます。存在しないページには本物の404か410を返しましょう。200を返す「見つかりません」ページは「ソフト404」となり、クロールバジェットを無駄にします。メンテナンス中はRetry-After付きの503を返せば、ページがインデックスから外れません。クローラーの巡回範囲はrobots.txt生成ツールで設定できます。
200、203、204、206、300、301、308、404、405、410、414、451、501のレスポンスは、明示的な鮮度ヘッダーがなくてもブラウザやCDNにキャッシュされることがあります。そのため誤って返した404や301が残り続けることがあるので、これらにはCache-Controlを意識的に設定してください。
ログでよく見る非公式コード
IANAレジストリにはないものの、実際によく使われるコードもあります。nginxは、レスポンス前にクライアントが接続を切ると499を、応答せずに接続を閉じると444を記録します。Cloudflareはオリジンサーバーから正常な応答を得られないと520–526を返します。521はオリジンが接続を拒否、522はタイムアウト、524は応答に100秒以上かかった、525/526はオリジンとのTLSが失敗したことを意味します。LaravelはCSRFトークンの有効期限が切れると419を返します。これらは一覧で「非公式」と表示され、非表示にもできます。
- HTTPステータスコードとは何ですか?
- すべてのHTTPレスポンスの先頭にある3桁の数字で、リクエストの結果をクライアントに伝えます。最初の桁がクラスを示し、1xxは情報、2xxは成功、3xxはリダイレクト、4xxはクライアントエラー、5xxはサーバーエラーです。
- 401と403の違いは何ですか?
- 401 Unauthorizedは、リクエストに有効な認証情報がないことを意味するので、ログインすれば解決する可能性があります。403 Forbiddenは、サーバーはあなたが誰か把握しているものの権限がないことを意味するので、ログインし直しても解決しません。
- リダイレクトには301と302のどちらを使うべきですか?
- URLの変更やドメイン移転など恒久的な移動には301(または308)を使います。検索エンジンはページの評価を新しいアドレスに引き継ぎます。元のURLを後で戻す場合は302(または307)を使います。
- 429 Too Many Requestsはどういう意味ですか?
- クライアントがレート制限を受けています。再試行する前に待ちましょう。Retry-Afterヘッダーがあれば、何秒後またはいつまで待つべきかが示されています。すぐに再試行せず、待ち時間を指数関数的に延ばすべきです。
- 502 Bad Gatewayエラーの原因は何ですか?
- サイトの前段にあるプロキシ、ロードバランサー、CDNが、背後のサーバーから不正な応答を受け取ったことが原因です。多くはアプリケーションのクラッシュ、再起動、接続の切断によるものです。対処はサーバー側で、アップストリームのアプリケーションのログを確認します。
- 499ステータスコードとは何ですか?
- nginx独自のコードで、nginxがレスポンスを送る前にクライアントが接続を閉じたときに記録されます。クライアントがこのコードを受け取ることはありません。499が多い場合、たいていはバックエンドが遅すぎてクライアントが待ちきれずにいることを意味します。
- 418 I'm a teapotは本物のステータスコードですか?
- RFC 2324(1998年)のエイプリルフールのジョークとして生まれました。実際に使うためのものではありませんが、多くのソフトウェアが実装しているため、RFC 9110では418を予約し、ほかの用途に割り当てられないようにしています。
- HTTPステータスコードはいくつありますか?
- IANAレジストリには、306や305のような予約済み・非推奨のものを含めて約63個のコードが定義されています。100〜599のコードが使用可能で、クライアントは未知のコードをそのクラスのx00コードとして扱います。