HTTPステータスコード

説明とユースケース付きのHTTPレスポンスステータスコードの完全なリファレンス。

HTTPステータスコードカテゴリー

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つのカテゴリーの概要

「vs」比較でつまずきやすいポイント

401 対 403。最も混同される組み合わせだ。401 Unauthorizedは「認証していない、ログインを試みよ」(名前は技術的に誤解を招く。これは認可ではなく認証に関するものだ)。403 Forbiddenは「認証はしているが、この操作は許可されていない」。認証情報は有効だがこのリソースへのアクセスを許可しない。よくある誤用:認証されていないリクエストに403を返すが、401WWW-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つの異なるアップストリーム障害モード:

404 対 410。404 Not Foundは「存在するかどうか不明」。410 Goneは「かつて存在したが、永続的に削除された」。SEOへの影響:Googleは410をコンテンツが永続的に利用不可である強いシグナルとして扱い、404より速くインデックスから削除する。

REST API規約

現代のREST APIは、どのアクションにどのステータスコードが意味するかについて、かなり一貫した規約に収束している:

メソッド正常系よくあるエラー
GET200 OK(ボディあり)、またはキャッシュ済みなら304 Not Modifiedリソースがない場合404、禁止の場合403
POST(作成)201 CreatedLocationヘッダーで新リソースを指す)不正なボディに400、バリデーションエラーに422、競合に409
PUT(置換)/ PATCH(更新)更新済みボディ付きの200 OK、または204 No Contentリソースがない場合404、バージョン競合に409
DELETE204 No Content(または削除確認付き200存在しない場合404
任意(レート制限)-429 Too Many RequestsRetry-Afterヘッダー付き)
任意(認証)-認証なしなら401、認証済みだが許可なしなら403

SEOへの影響

有名なコードと文化的なコード

よくある間違い

  1. エラーボディを持つレスポンスに200 OKを使う。{"error": "not found"}をステータス200で返すと、すべてのキャッシュレイヤー・監視ツール・クライアントSDKが混乱する。正しいステータスコードを使う。
  2. 認証されていないリクエストに403を返す。正しいコードは401WWW-Authenticateヘッダー付き)だ。
  3. 302を使っているが301が正しい。移動が永続的な場合、検索エンジンはランキングを移転するために301が必要だ。302は古いURLをインデックスに保持する。
  4. POST/PUTリダイレクトに301または302を使う。歴史的にこれらはクライアントがメソッドをGETに変更することを許可していた。307308は元のメソッドを厳密に保持する。
  5. 500を返しているが503が意図されている。サーバーが過負荷またはメンテナンス中なら、503Retry-After付き)がクライアントとGooglebotへの正しいシグナルだ。
  6. 永続的に削除されたページに404を使う。410 Goneが強いシグナルで、検索エンジンのインデックスから速く削除される。
  7. Locationヘッダーを201および3xxレスポンスに忘れる。Locationヘッダーはクライアントに新しいリソースの場所またはリダイレクト先を伝える。これがなければクライアントはナビゲートできない。

よくある質問

422400の代わりに返すのはいつですか?

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は世界で最も多く返されるステータスコードで「すべてうまくいった」を意味する。コードはリクエストのステータスを伝える:成功・リダイレクト・クライアントエラー・サーバーエラー。「エラーコード」と呼ぶとログに記録されて気付かれるネガティブなケースに偏る。成功コードはマイクロ秒ごとに静かに仕事をしている。

関連ツール

URLパーサー&デコーダー .htaccessジェネレーター 無料URLエンコーダー/デコーダー