ハローエンジニア!ナガヤンです!
みなさんは、次のような「3桁の数字とシンプルなメッセージ」だけのページを見たことはありますか?
引用元:デジタル庁
Webサイトを見ていると、 たまに 404 や 503 といった数字とメッセージが表示されるページが表示されます。
これらの数字は「HTTPステータスコード」と呼ばれるWebサイトの状況を伝えるための数字です。
HTTPステータスコードは、HTTPレスポンスコードとも呼ばれ、50種類以上存在します。
いったいなぜHTTPステータスコードがあるのか、どんな種類のステータスコードがあるのかをまとめました。
このページの目次
HTTPステータスコードは、「HTTPリクエスト」が正常に完了したかどうかを示すものです。
Webページを見る仕組みをざっくり説明すると次のような図になります。
「HTTPリクエスト」は、「ページの表示」や「入力内容の送信」といった、Webサーバに対する処理のリクエストのことを言います。
それに対してWebサーバから返される内容が「HTTPレスポンス」です。
このときWebサーバからのレスポンスで最初に返ってくるのが、HTTPステータスコードです。
ちなみに実際のHTTPレスポンスは次のようになっています(この記事では覚えなくても大丈夫です)。
HTTPステータスコードは、HTTPにおけるWebサーバからのレスポンスを3桁の数字で表現したものです。
「RFC 7231」などによって定義され、IANAが「HTTP Status Code Registry」として管理しています。
HTTPステータスコードは、次の5つに分類されています。
HTTPステータスコードの3桁の数字のうち、もっとも左の数字が分類を意味する数字です。
例えば「404」の場合は、もっとも左の数字が「4」なので、「クライアントエラー (Client Error)」に分類されます。
情報レスポンス(Information)は、リクエストが受け取られたことを意味するHTTPステータスコード。
このコードはHTTP通信が通っていることを確認する目的で伝えられ、HTTPリクエスト処理は継続されるため、画面上に表示されることはありません。
100 Continue
継続中。このコードは暫定レスポンスで、その時点までのすべてに問題がないことを示します。クライアントはリクエストの継続ができます。もしリクエストが完了している場合はレスポンスを無視してよいコードです。
101 Switching Protocol
プロトコル切替中。このコードはクライアントからのリクエストヘッダーのレスポンスとして送信され、サーバーがプロトコルを切り替えていることを示します。
成功レスポンス(Success)は、リクエストが受理されたことを意味するHTTPステータスコード。
Webページなどのコンテンツ情報が返されるため、画面上に表示されることはありません。ステータスコードに応じて、コンテンツ情報が表示されます。
200 OK
OK。リクエストが成功したことを示します。 HTTP メソッドによりリクエストに応じた情報が返ります。
201 Created
作成された。リクエストは成功し、その結果新たなリソースが作成されたことを示します。これは一般的に、 POST リクエストや、一部の PUT リクエストを送信した後のレスポンスになります。
202 Accepted
受理された。リクエストは受理されたが、まだ実行されていないことを示します。これはあいまいであり、なぜなら HTTP ではリクエストを処理した結果を示す非同期なレスポンスを後から送信する方法がないためです。リクエストは別のプロセスかサーバーが処理する、またはバッチ処理する予定です。
203 Non-Authoritative Information
信頼できない情報。このレスポンスコードは、返されるメタ情報のセットが生成元のサーバーから得られるセットと同一ではなく、ローカルまたは第三者の持つ複製から収集したことを表します。
これは主に、他のリソースのミラーやバックアップを使用したときに使用されます。このような場合以外は、このステータスより "200 OK" のほうが好ましいレスポンスです。
204 No Content
内容なし。リクエストに対して送信するコンテンツはありませんが、ヘッダーは有用であることを示します。
ユーザーエージェントはこのリソースに関するキャッシュ済みのヘッダーを、新たな内容に更新します。
205 Reset Content
内容のリセット。ユーザーエージェントに対し、リクエストを送信した文書をリセットするよう伝達します。
206 Partial Content
部分的内容。このレスポンスコードは、部分的にリクエストが受理しされたときに返されます。
クライアントが Range ヘッダーを送信し、リソースの一部だけをリクエストした時に使用されます。
リダイレクションメッセージ(Redirection)は、リクエストを完了させるために、追加処理が必要であることを意味するHTTPステータスコード。
Webページなどのリクエスト結果が返されるため、画面上に表示されることはめったにありません。Webサーバでリダイレクト先が設定されていれば、適切なリダイレクト先に画面が切り替わります。
300 Multiple Choice
複数の選択。リクエストに対して複数のレスポンスがあることを示します。ユーザーエージェントやユーザーは、それらからひとつを選択します。 (複数のレスポンスからひとつを選ぶ方法は標準化されていませんが、選択肢へリンクする HTML が推奨されており、それによってユーザーが選択することができます。)
301 Moved Permanently
恒久的に移動した。リクエストされたリソースの URL が永遠に変更されたことを示します。レスポンスで新しい URL が与えられます。
302 Found
発見した。このレスポンスコードは、リクエストされたリソースの URI が一時的に変更されたことを示します。 URI は将来、さらに変更される可能性があります。従って、クライアントは将来のリクエストでも同じ URI を使用するべきです。
303 See Other
他を参照せよ。サーバーはこのレスポンスを、リクエストされたリソースを別の URI で GET リクエストを使用して取得するようクライアントを誘導するために送信します。
304 Not Modified
未更新。これはキャッシュ用に使用します。このレスポンスコードはクライアントに対して、レスポンスは変更されていないことを示します。よって、クライアントはキャッシュ済みのレスポンスを使い続けます。
305 Use Proxy
プロキシを使用せよ。これは旧バージョンの HTTP 仕様書で、リクエストされたレスポンスはプロキシからアクセスしなければならないことを示していました。プロキシのインバンド設定に関するセキュリティの懸念により、このレスポンスコードは非推奨になりました。
307 Temporary Redirect
一時的なリダイレクト。サーバーはこのレスポンスを、リクエストされたリソースを別の URI で、元のリクエストと同じメソッドを使用して取得するようクライアントを誘導するために送信します。これは 302 Found HTTP レスポンスコードと同じ意味を持ちますが、ユーザーエージェントは使用する HTTP メソッドを変更してはならない点が異なります。始めのリクエストで POST を用いた場合は、次のリクエストでも POST を使用しなければなりません。
308 Permanent Redirect
恒久的リダイレクト。これは、リソースが Location: HTTP レスポンスヘッダーで指定した別の URI へ永続的に置かれていることを示します。これは 301 Moved Permanently HTTP レスポンスコードと同じ意味を持ちますが、ユーザーエージェントは使用する HTTP メソッドを変更してはならない点が異なります。始めのリクエストで POST を用いた場合は、次のリクエストでも POST を使用しなければなりません。
クライアントエラー (Client Error)は、クライアントからのリクエストに誤りがあったことを意味するHTTPステータスコード。
Webサイトを表示できないことを伝えるエラー用のコードで、利用者にも知らせる必要があるため、画面上にも表示されるコードです。
400 Bad Request
リクエストが不正である。構文が無効であるためサーバーがリクエストを理解できないことを示します。
401 Unauthorized
権限がない。HTTP 標準では "unauthorized" (不許可) と定義されていますが、意味的にはこのレスポンスは "unauthenticated" (未認証) です。つまり、クライアントはリクエストされたレスポンスを得るためには認証を受けなければなりません。
402 Payment Required
支払いが必要である。このレスポンスコードは、将来のために予約されています。このコードは当初、デジタル決済システムで使用するために作成されましたが、ごく稀にしか使用されておらず、標準的な慣例はありません。
403 Forbidden
禁止されている。認証されていないなどの理由でクライアントにコンテンツのアクセス権がなく、サーバーが適切なレスポンスの返信を拒否していることを示します。 401 とは異なり、クライアントの識別子がサーバーに知られています。
404 Not Found
未検出。サーバーがリクエストされたリソースを発見できないことを示します。ブラウザでは、 URL が解釈できなかったことを意味します。 API では、通信先が有効であるもののリソース自体が存在しないことを意味することがあります。サーバーは認証されていないクライアントからリソースの存在を隠すために、 403 の代わりにこのレスポンスを返すことがあります。このレスポンスコードはウェブで頻繁に見られるため、おそらくもっとも有名なコードでしょう。
405 Method Not Allowed
許可されていないメソッド。サーバーがリクエストメソッドを理解しているものの、無効にされており使用することができません。例えば、 API がリソースを DELETE することを禁止できます。 GET および HEAD の二つは必須で、無効にすることができず、このエラーコードを返してはいけません。
406 Not Acceptable
受理できない。このレスポンスは、ウェブサーバーが サーバー駆動型コンテンツネゴシエーション (en-US) を行った結果、ユーザーエージェントから与えられた条件に合うコンテンツが見つからない場合に送信されます。
407 Proxy Authentication Required
プロキシ認証が必要である。これは 401 に似ていますが、プロキシサーバーが認証を要求している点が異なります。
408 Request Timeout
リクエストタイムアウト。このレスポンスはクライアントが以前にリクエストを行っていない、アイドル状態のコネクションにおいて一部のサーバーが送信します。サーバーは使用していないコネクションの終了を望むことを示します。このレスポンスは Chrome、 Firefox 27 以降、IE9 など、閲覧を高速化するための HTTP 事前接続機能を使用する一部のブラウザーでよく使用します。また、一部のサーバーはこのメッセージを送らずにコネクションを閉じることに注意してください。
409 Conflict
競合している。このレスポンスは、リクエストがサーバーの現在の状態と矛盾する場合に送られるでしょう。
410 Gone
消滅した。このレスポンスは、リクエストされたコンテンツがサーバーから永久に削除され、転送先アドレスがない場合に送られます。クライアントはこのリソースへのキャッシュやリンクを削除することが期待されます。 HTTP 仕様書ではこのコードを「期間限定のプロモーションサービス」に使用することを意図しています。 API はこのステータスコードの場合、削除されたリソースを無理に示そうとするべきではありません。
411 Length Required
長さが必要。サーバーが Content-Length ヘッダー項目を要求しているが、リクエストで定義されていないために、サーバーがリクエストを拒否したことを示します。
412 Precondition Failed
前提条件で失敗した。サーバー側で適合しない前提条件が、クライアント側のヘッダーに含まれていることを示します。
413 Payload Too Large
ペイロードが大きすぎる。リクエストの本体がサーバーで定めている上限を超えていることを示します。サーバーはコネクションを閉じるか、Retry-After ヘッダー項目を返します。
414 URI Too Long
URIが大きすぎる。クライアントがリクエストした URI が、サーバーで扱える長さを超えていることを示します。
415 Unsupported Media Type
サポートしていないメディアタイプ。リクエストされたデータのメディア形式をサーバーが対応しておらず、サーバーはリクエストを拒否したことを示します。
416 Range Not Satisfiable
レンジは範囲外にある。リクエスト内の Range ヘッダー項目で指定された範囲を満たすことができないことを示します。指定した範囲が、目的の URI のデータサイズを超えている可能性があります。
417 Expectation Failed
Expectヘッダによる拡張が失敗。このレスポンスコードは、Expect リクエストヘッダーで指定された内容がサーバー側と適合しないことを示します。
418 I'm a teapot
私はティーポット。HTCPCP/1.0の拡張ステータスコード。
ティーポットにコーヒーを淹れさせようとして、拒否された場合に返すとされる、ジョークのコードです。2017年にはこれを除去しようという動きがありましたが、反対運動が起こったため、418は正式に「予約済み」となりました。
451 Unavailable For Legal Reasons
法的理由により利用不可。ユーザーエージェントが政府によって検閲されたウェブページなど、違法なリソースをリクエストしています。
403 Forbiddenから派生したステータスコードで、書籍が違法化された世界を描く1953年のディストピア小説『華氏451度』にちなんでいます。
ジョークのようですが、418とは違い、RFC7725で定義された正式なステータスコードです。
サーバエラー(Server Error)は、サーバがリクエストの処理に失敗したことを意味するHTTPステータスコード。
Webサイトを表示できないことを伝えるエラー用のコードで、利用者にも知らせる必要があるため、画面上で見かけるコードです。
500 Internal Server Error
サーバ内部エラー。サーバー側で処理方法がわからない事態が発生したことを示します。
501 Not Implemented
実装されていない。リクエストメソッドをサーバーが対応しておらず、扱えないことを示します。サーバーが対応しなければならない (従って、このコードを返してはならない) メソッドは GET と HEAD だけです。
502 Bad Gateway
不正なゲートウェイ。このエラーレスポンスは、リクエストの処理に必要なレスポンスを受け取るゲートウェイとして動作するサーバーが無効なレスポンスを受け取ったことを示します。
503 Service Unavailable
サービス利用不可。サーバーはリクエストを処理する準備ができていないことを示します。一般的な原因は、サーバーがメンテナンスや過負荷でダウンしていることです。このレスポンスとともに問題について説明する、ユーザーにわかりやすいページを送信するべきであることに注意してください。このレスポンスは一時的な状況について使用するものであり、また可能であれば、サービスが復旧する前に Retry-After: HTTP ヘッダーに予定時刻を含めるべきです。また、これら一時的な状況のレスポンスは通常キャッシュされるべきではないことから、ウェブ管理者はこのレスポンスとともに送られるキャッシュ関連のヘッダーに注意しなければなりません。
504 Gateway Timeout
ゲートウェイタイムアウト。このエラーレスポンスは、ゲートウェイとして動作するサーバーが時間内にレスポンスを得られない場合に送られます。
505 HTTP Version Not Supported
サポートしていないHTTPバージョン。リクエストで使用した HTTP のバージョンをサーバーが対応していないことを示します。
今回紹介したHTTPステータスコードは、遭遇しやすいステータスコードが中心になっています。
見ることはないけど大切な100番台や200番台、大事な時に現れて困ってしまう400番台や500番台。
HTTPステータスコードを知っていれば、Webサイトで遭遇したり、自らのサイトで発生したときにも問題を解決する助けとなります。