初心者のためのHTTPステータスコードの解説

HTTPステータスコードとは?

  • 厳密に言うと、HTTPレスポンスのステータスコードは
  • サーバーからの応答の意味を示す3桁の数値コード
  • 特定のHTTPリクエストが正常に完了したかどうかを示す

HTTPレスポンス

レスポンスメッセージは、主に以下の3種類の情報に分けられます。

-ステータスライン
-HTTP レスポンスヘッダ
-HTTP レスポンスボディ

ステータスコードはヘッダの1行目にある

ステータスコードは、ヘッダーの最初の行にあるステータスラインに

http/1.1 200 ok
Date: Sat, 22 Feb 2020 08:09:30 GMT
コンテンツタイプ: アプリケーション/json; charset=utf-8
接続: keep-alive
サーバー: nginx
ETag: "e287c729017cc9785487098b6b103af6"
Cache-Control: max-age=0, private, must-revalidate
X-UA-Compatible: IE=Edge,chrome=1
X-Runtime: 0.003487

ステータスラインには、ここで説明するステータスコードの他に、プロトコルとテキストフレーズが含まれています。

HTTP/1.1 200 OK
  • プロトコルは HTTP/1.1
  • ステータスコード 200
  • テキストのフレーズ OK

ヘッダーはさらに細分化されていますが、この場合は違います。

https___media.prod.mdn.mozit.cloud_attachments_2016_08_31_13823_0a5a12cef96993c8d6fa843d7230a9d9_HTTP_Response_Headers2

ステータスコードは以下の5つのクラスに分かれています。

100s = 情報応答
200s = 成功応答
300s = リダイレクト
400s = クライアントエラー
500s = サーバーエラー

以下に、代表的なステータスコードの概要を抜粋します。

番号 100 情報応答

  • 処理が継続していることを示す。
  • クライアントは、リクエストを続行するか、サーバーの指示に従ってプロトコルを更新して再送することができます。
  • HTTP/1.0の規約では1xx番号の定義がないため、100番台はあまり使われません。

100 続行

サーバーはリクエストを拒否していません。クライアントはリクエストを続行できます。

101 プロトコルの切り替え

サーバーがプロトコルの切り替えを要求しています。

200 単位 成功した応答

  • 成功時に返される最も一般的なステータスコード
  • 要求された操作は成功し、指定されたデータの取得に成功しました。
  • GET: ボディにリソースが格納されています。
  • PUT、POST。ボディに操作結果が格納されている

201 作成

  • POST, PUTです。リクエストが成功し、リソースが作成されました。
  • POST の場合、URI はレスポンスの Location ヘッダーに含まれます。
  • ユーザーの新規登録、画像のアップロード、DBテーブルの追加など。
  • ボディには新しく作成されたリソースが含まれていることが多いですが、特に何も含まれていなくても構いません。

202 Accepted

  • リクエストは受理されましたが、まだ処理されていません。
  • ファイル形式の変換、プッシュ通知リクエスト、バッチ処理など、サーバー側で非同期の処理が行われる場合に返されます。

204 コンテンツなし

  • レスポンスボディが空の場合に返されます。
  • DELETE でデータを削除したときに返されます。
  • POST でフォームの内容を送信したが、画面が更新されていない場合に表示されます。
  • PUTやPATCHでデータが正しく更新された場合
  • DELETE以外には使うべきではないという意見もあります。

205 コンテンツのリセット

  • ユーザーエージェントの画面がリセットされたときに返されます。
  • 204 と同様、応答ボディはありません。

300 複数の選択肢のリダイレクト

300 複数の選択肢

  • リクエストに対して複数の回答があることを示します。
  • ユーザーエージェントやユーザーには、選択肢へのリンクとなるHTMLが表示され、ユーザーはその中から1つを選択します。

301 Moved Permanently

  • リクエストされたリソースの URL が恒久的に変更されたことを示します。
  • ウェブサイトの移動や、HTTP から HTTPS へのリダイレクトなどです。
  • Location ヘッダーは移動先の URL を示します。

302 Found

 

  • リクエストされたリソースのURLが一時的に変更されました。
  • 送信先のURLは、Locationヘッダーに表示されます。
  • 実際には、307として再定義され、現在は非推奨となっている303に使用されることが多いようです。

303 See Other

  • 要求されたリソースが別の URI で取得可能であることを示します。
  • Location ヘッダーは、移動先の URL を示します。
  • ブラウザのフォームからのPOSTに応答して結果ページにリダイレクトする際に使用します。

307 一時的なリダイレクト

  • 一時的なリダイレクト
  • 誤用が横行したため、302 を再定義したものです。
  • Location ヘッダーは、ユーザーがリダイレクトされる URL を示します。
  • ユーザーエージェントは、使用する HTTP メソッドを変更しないでください。

308 パーマネントリダイレクト

  • パーマネントリダイレクト
  • 301 の規格外の使い方が横行しているため再定義しました。
  • Location ヘッダーは、移動先の URL を示します。
  • ユーザーエージェントは、使用する HTTP メソッドを変更してはいけません。

400 クライアントエラー

400 Bad Request

  • 不正なリクエスト
  • 定義されていないメソッドを使用したり、不正なパラメーターを使用したりするなど、不正なクライアントリクエストです。
  • また、適切なクライアントエラーを示すステータスコードが他にない場合にも使用します。

401 認証されていません

  • 認証エラー
  • ログインが必要なページで、ID やパスワードが間違っています。
  • リクエストに必要な Authorization ヘッダーが含まれていません。
  • トークンの有効期限が切れている、破損しているなどの理由で無効になっています。

403 Forbidden

  • 認証エラー
  • クライアントにアクセスする権限がないなどの理由で、サーバーからの応答が拒否されています。
  • サーバーが特定のIPアドレスからしかアクセスできない場合に使用します。
  • 401 とは異なり、クライアントは識別されます。

404 Not Found

  • 要求されたリソースが存在しません。
  • Web 上で最もよく見られるエラーステータスコードの 1 つです。
  • URI 自体が存在しないのか、または取得するリソースが存在しないのかを判断するためには、より多くの情報が必要です。
  • 権限のないクライアントからリソースの存在を隠すために、403ではなく404を返すこともあります。

405 メソッドが許可されていません

  • エンドポイントは存在するが、HTTP メソッドが許可されていません。
  • GET でアクセス可能な検索 API で POST を使おうとした場合。
  • APIがリソースのDELETEを禁止している場合。

408 リクエストタイムアウト

  • 指定された時間内にリクエストが完了しませんでした。
  • ChromeやFirefoxなど、ブラウジングを高速化するためにHTTPの事前接続機能を使用するブラウザでよく使われます。
  • 回線の接続速度が遅い場合に発生します。

409 コンフリクト

  • リソースの競合が発生した場合に発生します。
  • 既に存在するメールアドレスや同じIDのユーザーを登録しようとした場合。
  • 空でないディレクトリを削除しようとしたり、既に使用されているリソースに名前を変更しようとした場合。

410 Gone

  • リクエストされたコンテンツがサーバーから永久に削除されており、転送先がない場合。
  • 404 とは異なり、コンテンツがかつて存在していたが、現在は存在しないことを意味します。
  • 期間限定のプロモーションでの使用を意図しています。
  • ユーザー情報を扱い、410を返すAPIは、個人情報保護の観点から問題視されることがあります(ユーザーが削除した情報が保持されている≒ユーザーが完全に削除したわけではないということ)。

413 ペイロードが大きすぎる

  • リクエストヘッダまたはボディが、サーバが設定した制限値を超えたことを示します。
  • サーバーは接続を閉じるか、エラーメッセージをサーバーに送信します(例:ファイルのアップロードが許容サイズを超えた場合)。
  • サーバーは接続を閉じるか、Retry-Afterヘッダーを返します。

 

414 URI Too Long

  • クライアントが要求した URI がサーバーの処理能力を超えています。
  • サーバーは接続を閉じるか、Retry-Afterヘッダーを返します。

415 サポートされていないメディアタイプ

  • 要求されたデータのメディアタイプ(Content-Type)をサーバーがサポートしていないため、サーバーは要求を拒否しました。
  • JSON リクエストしか受け付けない API に XML を送信したか、サポートされていない画像形式の画像をアップロードしようとしました。

429 リクエスト数が多すぎます

  • アクセス数が許容値を超えた場合に返されます。
  • 2012年にRFC6585で定義された新しいステータスコードです。
  • 一定時間内にレート制限を超える大量のリクエストが送信されています(例:1分間に60リクエストのAPIリクエスト制限など)。

500 サーバーエラー

500 Internal Server Error

  • サーバー側で何らかのエラーが発生し、応答が正常ではありません。
    -「Something went wrong」というエラーメッセージが返されることが多く、クライアントでは解決できません。
    -他に適切なエラーコードがない場合にも使用されます。
    -サーバーのエラーログを見ることで原因がわかる場合もあります。

502 Bad Gateway

-ゲートウェイまたはプロキシに問題があります。
-ゲートウェイとして動作しているサーバーが無効な応答を受信しました。

503 Service Unavailable

-サーバーがリクエストを処理する準備ができていません。
-一時的なトラフィックの集中やメンテナンスなどにより、サーバーがダウンしています。
-メンテナンスの場合は、Retry-After ヘッダーに再起動予定時間(秒)を含めることができます。

504 ゲートウェイタイムアウト

-ゲートウェイとして動作しているサーバーが、指定された時間内に応答を受信しなかったことを示します。
-サイトの移行などによる一時的なDNSの異常の可能性があります。

505 HTTP バージョン未対応

-サーバーは要求された HTTP プロトコルのバージョンをサポートしていません。
-現在のプロトコルは HTTP/2 です。
-HTTP/2 Overview|Web Fundamentals|Google Developers

 

参考

 

HTTPステータスコード 完全に理解した

藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

未整理記事

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です