HTTPステータスコード
説明とユースケース付きのHTTPレスポンスステータスコードの完全なリファレンス。
HTTPステータスコードカテゴリー
- 1xx(情報) · リクエストを受信、処理中。
- 2xx(成功) · リクエストが正常に受信、理解、受け入れられた。
- 3xx(リダイレクト) · リクエストを完了するために追加のアクションが必要です。
- 4xx(クライアントエラー) · 構文が誤っているか、満たすことができないリクエスト。
- 5xx(サーバーエラー) · サーバーが有効なリクエストを満たすことができませんでした。
301と302の違いは?
301 Moved Permanentlyは、リソースが永続的に移動したことをクライアントに伝えます · 検索エンジンはランキングを転送します。302 Foundは一時的なリダイレクトです · 元のURLはそのランキングを保持します。
401と403はいつ使い分けるべきですか?
401 Unauthorizedは「認証されていない」を意味します · クライアントは認証情報を提供する必要があります。403 Forbiddenは「認証済みだが許可されていない」を意味します · 認証情報があっても変わりません。
ステータスコード418は何を意味しますか?
418「I'm a teapot」は、RFC 2324(Hyper Text Coffee Pot Control Protocol)からのエイプリルフールジョークです。実際には使用されませんが、開発者文化で広く知られています。
30年の変遷を経た標準
HTTPステータスコードはいくつかの仕様世代を経てきた。RFC 1945(1996年5月)はHTTP/1.0を基本的な1xx-5xxカテゴリーとともに標準化した。RFC 2616(1999年6月)はHTTP/1.1を出荷し、10年以上にわたって標準的なリファレンスだった。7230-7235シリーズ(2014年6月)はHTTP/1.1をトピック別に複数の仕様に分割した。現在の統合標準はRFC 9110「HTTP Semantics」(2022年6月)で、7230-7235の分割を廃止し、現代の作業における適切な引用元だ。割り当てられたコードのライブレジストリはIANAのHTTPステータスコードレジストリにある。
5つのカテゴリーの概要
- 1xx 情報:暫定レスポンス。リクエストを受信し、サーバーが処理を続けていることを示す。実際にはまれ。プロトコルアップグレードと
103 Early Hints(完全なレスポンスの準備前にサーバーが重要なリソースをプリロードできる)に便利だ。 - 2xx 成功:リクエストを受信し、理解され、受け入れられた。
200 OKは日常的なケース。201 Createdはリソース作成用。204 No Contentは返すものがない成功したアクション用。 - 3xx リダイレクト:さらなるアクションが必要。クラシックなリダイレクト(
301 Moved Permanently・302 Found・307 Temporary Redirect・308 Permanent Redirect)とキャッシュバリデーション用の304 Not Modified。 - 4xx クライアントエラー:クライアントが何か間違いを犯した。構文エラー・認証不足・存在しないものへのリクエスト。実際のトラフィックで最大のカテゴリー。
- 5xx サーバーエラー:サーバーが失敗した。リクエストは有効だったが、サーバーが対応できなかった。オンコールエンジニアを叩き起こすのがこれだ。
「vs」比較でつまずきやすいポイント
401 対 403。最も混同される組み合わせだ。401 Unauthorizedは「認証していない、ログインを試みよ」(名前は技術的に誤解を招く。これは認可ではなく認証に関するものだ)。403 Forbiddenは「認証はしているが、この操作は許可されていない」。認証情報は有効だがこのリソースへのアクセスを許可しない。よくある誤用:認証されていないリクエストに403を返すが、401とWWW-Authenticateヘッダーが正しい。
301 対 302 対 307 対 308。2つの軸:永続的か一時的か、メソッド保持の動作:
| コード | 永続的? | メソッド保持? | SEOランキングシグナル |
|---|---|---|---|
| 301 Moved Permanently | はい | 歴史的にクライアントはPOST → GETに変更した | 永続的、ランキングを新URLに移転 |
| 302 Found | いいえ | 歴史的にクライアントはPOST → GETに変更した | 一時的、元のURLがランキングを保持 |
| 307 Temporary Redirect | いいえ | 厳密、POSTはPOSTのまま | 302と同じ |
| 308 Permanent Redirect | はい | 厳密、POSTはPOSTのまま | 301と同じ |
GETリクエストをSEO目的でリダイレクトする場合、301が慣例的な選択だ。POSTまたはPUTリクエストをリダイレクトしてメソッドを保持したい場合、307または308が必要だ。
400 対 422。400 Bad Requestは構文的に不正なリクエスト(無効なJSON・必須ヘッダーの欠如・不正なクエリパラメーター)に使う。422 Unprocessable Entity(元はWebDAVコード、REST APIで広く採用)は構文的に有効だが意味的な問題があるリクエスト(JSONは正しくパースされるが、値がビジネスバリデーションに失敗する:注文のマイナス数量・すでに使用中のメールアドレス)に使う。多くのAPIは両方を使う。
502 対 503 対 504。3つの異なるアップストリーム障害モード:
502 Bad Gateway:プロキシ/ゲートウェイがアップストリームサーバーから無効なレスポンスを受信した。503 Service Unavailable:サーバーが過負荷またはメンテナンス中。Retry-Afterヘッダーと組み合わせることが多い。504 Gateway Timeout:アップストリームサーバーが時間内に応答しなかった。
404 対 410。404 Not Foundは「存在するかどうか不明」。410 Goneは「かつて存在したが、永続的に削除された」。SEOへの影響:Googleは410をコンテンツが永続的に利用不可である強いシグナルとして扱い、404より速くインデックスから削除する。
REST API規約
現代のREST APIは、どのアクションにどのステータスコードが意味するかについて、かなり一貫した規約に収束している:
| メソッド | 正常系 | よくあるエラー |
|---|---|---|
| GET | 200 OK(ボディあり)、またはキャッシュ済みなら304 Not Modified | リソースがない場合404、禁止の場合403 |
| POST(作成) | 201 Created(Locationヘッダーで新リソースを指す) | 不正なボディに400、バリデーションエラーに422、競合に409 |
| PUT(置換)/ PATCH(更新) | 更新済みボディ付きの200 OK、または204 No Content | リソースがない場合404、バージョン競合に409 |
| DELETE | 204 No Content(または削除確認付き200) | 存在しない場合404 |
| 任意(レート制限) | - | 429 Too Many Requests(Retry-Afterヘッダー付き) |
| 任意(認証) | - | 認証なしなら401、認証済みだが許可なしなら403 |
SEOへの影響
200 OK:Googleはページを通常通りインデックスする。301 Moved Permanently:GoogleはインデックスのURLを新しいURLに更新し、ランキングシグナルを移転する。302 Found/307 Temporary Redirect:Googleは元のURLをインデックスに保持する。ランキングは元のURLとともに留まる。308 Permanent Redirect:Googleは301と同様に扱う。ランキングが移転する。304 Not Modified:条件付きリクエストのGooglebotに使用される。キャッシュされたコンテンツが再利用できることを示す。404 Not Found:Googleはいくつかのクロール後にURLをインデックスから削除する。410 Gone:Googleは404より速くURLを削除する。「永続的に消去された」という強いシグナルだ。503 Service Unavailable(Retry-After付き):Googlebotに後で戻るよう伝える。メンテナンス中に使用する。本物のエラーに503を使うのは避ける(Googleは持続的な503をクロールしない指示と解釈する)。5xx持続:Googleはクロール速度を下げ、最終的にURLをインデックスから完全に削除することがある。
有名なコードと文化的なコード
418 I'm a teapot:RFC 2324(Hyper Text Coffee Pot Control Protocol、1998年4月1日)のエイプリルフールジョーク。IETFが2017年に仕様から削除することを提案したとき、「Save 418」キャンペーンが成功してこれを維持した。一部のAPIが「これは本物ではない」マーカーとして使用する。それ以外は無害だ。451 Unavailable For Legal Reasons:RFC 7725(2015年)、Ray BradburyのFahrenheit 451にちなんで命名。裁判所命令または政府の要請によってコンテンツが検閲されたときに返される。- Cloudflareの520-527シリーズ:非標準。Cloudflareが特定のアップストリームサーバー接続の失敗を示すために使用する。Cloudflare背後のサイトに問題がある場合によく見られる。
- Nginxの
444 No Response:Nginx固有。サーバーがレスポンスを送信せずに接続を閉じた場合に返される。 - Twitterの歴史的な
420 Enhance Your Calm:Twitterの以前のAPIで使用されていた、現在は削除されたレート制限コード。標準の429に置き換えられた。
よくある間違い
- エラーボディを持つレスポンスに
200 OKを使う。{"error": "not found"}をステータス200で返すと、すべてのキャッシュレイヤー・監視ツール・クライアントSDKが混乱する。正しいステータスコードを使う。 - 認証されていないリクエストに
403を返す。正しいコードは401(WWW-Authenticateヘッダー付き)だ。 302を使っているが301が正しい。移動が永続的な場合、検索エンジンはランキングを移転するために301が必要だ。302は古いURLをインデックスに保持する。- POST/PUTリダイレクトに
301または302を使う。歴史的にこれらはクライアントがメソッドをGETに変更することを許可していた。307と308は元のメソッドを厳密に保持する。 500を返しているが503が意図されている。サーバーが過負荷またはメンテナンス中なら、503(Retry-After付き)がクライアントとGooglebotへの正しいシグナルだ。- 永続的に削除されたページに
404を使う。410 Goneが強いシグナルで、検索エンジンのインデックスから速く削除される。 Locationヘッダーを201および3xxレスポンスに忘れる。Locationヘッダーはクライアントに新しいリソースの場所またはリダイレクト先を伝える。これがなければクライアントはナビゲートできない。
よくある質問
422を400の代わりに返すのはいつですか?
400 Bad Requestはリクエスト自体が不正(無効なJSON・必須ヘッダーの欠如・不正なクエリパラメーター)を意味する。422 Unprocessable Entityはリクエストは整形式だが処理を妨げる意味的エラー(マイナスの数量フィールド・すでに使用中のメールアドレス・未来限定フィールドへの過去の日付)を含むことを意味する。現代のREST API規約はこの分割に収束しており、多くの大型API(GitHub・Stripe・Twilio)がバリデーションエラーに422を使用している。
CloudflareはなぜときどきCloudflare 520・521・522…を返すのですか?
520-527コードはCloudflare固有で、エッジがオリジンサーバーに到達できなかったさまざまな方法を示す。520は汎用の「ウェブサーバーが不明なエラーを返した」。521はオリジンが接続を拒否した。522はオリジンへの接続タイムアウト。524はオリジンの応答が遅すぎた。IANAレジストリにはないが、Cloudflare背後のサイトでバックエンド問題がある場合によく見られる。
ブラウザはAPIが返したコードを表示してくれますか?
はい。DevTools → ネットワークタブを開き、リクエストをクリックして「ステータス」列を確認する。ブラウザも一部のコードに対して汎用ページを表示する(Chromeの接続失敗時の恐竜ゲーム・標準の404/500ページ)。ただし実際の数値コードは常にレスポンスに含まれる。
103 Early Hintsとは何ですか?
比較的新しい(RFC 8297、2017年)1xxコードで、完全なレスポンスの準備前にサーバーがLink: rel=preloadヘッダーを送信でき、ブラウザに重要なリソース(CSS・フォント・画像)の早期フェッチ開始を指示する。ChromeでサポートされCloudflare・Fastlyおよび他のCDNがパフォーマンス最適化として出荷している。
独自のステータスコードを作れますか?
技術的にはできる(HTTPは100-599の範囲で任意の3桁コードを許可する。実際にはできない)。クライアント・プロキシ・キャッシュは未知のコードを最初の桁で扱う(4xx = 汎用クライアントエラー、5xx = サーバーエラー)。一部のベンダーはこれをする(Cloudflareの520系、Nginxの444)。しかし通信の両端をコントロールしない限り、IANAレジストリに従う。299を発明してもものは壊れないが何も伝えない。
「ステータスコード」はなぜ「エラーコード」ではなく「ステータス」と呼ばれるのですか?
ほとんどはエラーでないからだ。200 OKは世界で最も多く返されるステータスコードで「すべてうまくいった」を意味する。コードはリクエストのステータスを伝える:成功・リダイレクト・クライアントエラー・サーバーエラー。「エラーコード」と呼ぶとログに記録されて気付かれるネガティブなケースに偏る。成功コードはマイクロ秒ごとに静かに仕事をしている。