【エラーコード】HTTPステータスコードの原因一覧


【エラーコード】HTTPステータスコードの原因一覧

エンジニアのふとしです。

ネットをしていて、以下のような文言に遭遇することはないでしょうか。

 
404. that’s an error.

この状態を見た親から「インターネットが壊れた!」と連絡がきたことがあるので、簡単に説明しようと思います。
普段インターネットをする際には意識しないかもしれませんが、この数字はそれぞれに意味が存在する「HTTPステータスコード」と呼ばれるものです。

ウェブサーバとブラウザの仕組み

インターネット経由で情報を得る場合、ブラウザ(IEとかChromeとか)がサーバからページを取得しているというのは、みなさんなんとなく知っているかと思います。

サーバはリクエストに対しHTML形式でデータを返す

みなさんのブラウザからサーバに「このページが見たいよ」というリクエストが送られると、サーバはHTML形式でデータを返します。
HTML形式はブラウザが解析できるファイル形式で、そのまま見るとただのテキストです。HTML内で「ここを赤色に、ここは右寄せに」などの装飾をしたい場合は、CSSという形式で指定をしておくとブラウザがきれいに表示してくれます。

データを返す際に、HTTPステータスコードも同時に送信

情報のやりとりで特に問題がない場合、サーバはHTTPステータスコード200を返し、ブラウザが理解できる情報(HTML,CSSや画像ファイルなど)を同時に送信します。
正常にページが表示された場合は、画面にHTTPステータスコードが表示されることはないため、あまり目につくことはないと思います。

問題はエラーになった場合で、原因はURLの間違えからサーバの故障まで多岐にわたります。そうした原因をブラウザ(見ている人)に伝えるためのコードが、冒頭にでてきたHTTPステータスコードです。

HTTPステータスコード一覧表

それでは、どんなHTTPステータスコードがあるのか一覧で見てみましょう。

1xx Informational

リクエストは成功し処理が継続される。

100 Continue リクエストを継続できる。
101 Switching Protocols サーバがリクエストに対してプロトコルの切替えを要求している。
102 Processing 処理中である。

2xx Success

リクエストが成功した。

200 OK リクエストが成功し、要求に対する情報が返される。
ブラウザでページが正しく表示された場合は、ほとんどがこのステータスコードを返している。
201 Created リクエストが完了し、新たに作成されたデータのURIが返される。
202 Accepted リクエストは受理されたが、処理は完了していない場合に返される。
203 Non-Authoritative Information 実際の情報ではなくローカルやプロキシなどからの情報である場合に返される。
204 No Content リクエストを受理したが、返すべき情報が存在しない場合に返される。
205 Reset Content リクエストを受理し、ユーザエージェントの画面をリセットする場合に返される。
206 Partial Content レジュームを行ったような場合に、部分的GETリクエストを受理したときなどに返される。
207 Multi-Status 複数のステータスが存在する場合に返される。
226 IM Used IMを使用している。Delta encoding in HTTPの拡張ステータスコード。

3xx Redirection

リダイレクション。
リクエストを完了させるためには追加で処理が必要。

300 Multiple Choices リクエストしたリソースが複数存在し、選択が必要な場合に選択肢と一緒に返される。
301 Moved Permanently リクエストしたリソースが恒久的に移動されているときに返される。
302 Found リクエストしたリソースが一時的に移動されているときに返される。
元々はMoved Temporarily(一時的に移動した)だったがイレギュラーな使われ方が多かったため、302はFoundになり、新規で303,307が追加された。
303 See Other リクエストに対するレスポンスが他のURIに存在するときに返される。
304 Not Modified リクエストしたリソースは更新されていないことを示す。
jsや画像などのキャッシュで変更がなかった場合によく使われる。
305 Use Proxy プロキシを使用してリクエストを行わなければならない場合に返される。
306 (Unused) 未使用である。
307 Temporary Redirect リクエストしたリソースが一時的に移動されている場合に返される。
308 Permanent Redirect 現在提唱中の新しいステータスコード。
301との違いは、明確にPOST,GETの変更を許可しない点。

4xx Client Error

クライアントエラー。
クライアントからのリクエストが成功しなかった。

400 Bad Request 定義されていないメソッドを使うなど、クライアントのリクエストに異常がある場合に返される。
401 Unauthorized Basic認証やDigest認証などを行うときに使用される。
402 Payment Required 支払いが必要である場合。
現在は未実装で、将来のために予約してあるらしい。
403 Forbidden リソースにアクセスすることを拒否された。
サーバ構築時に権限設定をミスしたときによく見ます。
404 Not Found リソースが見つからなかった場合。
よく見ますね。
405 Method Not Allowed 許可されていないメソッドを使用しようとした。
POSTメソッドの使用が許されていないURIにPOSTでアクセスした場合など。
406 Not Acceptable Accept関連のヘッダに受理できない内容が含まれている場合に返される。
Accept-Language、Accept-Charsetなどでファイル形式、言語をブラウザが許可していない場合など。
407 Proxy Authentication Required プロキシの認証が必要な場合に返される。
408 Request Timeout リクエストが時間以内に完了していない場合に返される。
409 Conflict リクエストが現在のリソースと矛盾するので完了できない。
410 Gone リソースは恒久的に移動・消滅した。どこに行ったかもわからない。
404 Not Foundと似ているが、こちらは二度と復活しない場合に使われる。かっこいい。
411 Length Required Content-Lengthヘッダがないのでサーバがアクセスを拒否した場合に返される。
412 Precondition Failed 前提条件が誤りだった場合に返される。
413 Request Entity Too Large リクエストエンティティがサーバの許容範囲を超えている場合に返す。サーバの制限サイズより大きいファイルをアップロードしたようなとき。
414 Request-URI Too Long URIが長過ぎるのでサーバが処理を拒否した場合に返す。
画像データのような大きなデータをGETメソッドで送ったような場合。
415 Unsupported Media Type 指定されたメディアタイプがサーバでサポートされていない場合に返す。
416 Requested Range Not Satisfiable 実リソースのサイズを超えるデータを要求した場合に返す。
リソースのサイズが1024Byteしかないのに、1025Byteを取得しようとした場合など。
417 Expectation Failed サーバが拡張ステータスコードを扱えない場合に返す。
418 I’m a teapot HTCPCP/1.0の拡張ステータスコード。
ティーポットにコーヒーを淹れるリクエストが来て、拒否された場合に返す。
422 Unprocessable Entity WebDAVの拡張ステータスコード。
423 Locked WebDAVの拡張ステータスコード。リクエストしたリソースがロックされている場合に返す。
424 Failed Dependency WebDAVの拡張ステータスコード。依存関係でエラーになった場合に返す。
426 Upgrade Required Upgrading to TLS Within HTTP/1.1の拡張ステータスコード。アップグレードが必要な場合に返す。

5xx Server Error

サーバエラー。
サーバがリクエストの処理に失敗した。

500 Internal Server Error サーバ内部でエラーが発生した場合に返される。
サーバ上で動作させているプログラムに文法エラーがあったり、設定に誤りがあった場合などに返される。
501 Not Implemented WebDAVが実装されていないサーバに対して、WebDAVで使用するメソッド(MOVEやCOPY)を使用した場合などに返される。
502 Bad Gateway ゲートウェイ・プロキシサーバで不正な要求を受け取り、拒否した場合に返される。
503 Service Unavailable サービスが一時的に過負荷やメンテナンスで使用不可能である場合に返される。
アクセスが集中してサーバが処理できない場合によくでます。
504 Gateway Timeout ゲートウェイ・プロキシサーバが制限時間内に処理できなかった場合に返される。
505 HTTP Version Not Supported リクエストがサポートされていないHTTPバージョンである場合に返される。
506 Variant Also Negotiates Transparent Content Negotiation in HTTPで定義されている拡張ステータスコード。
ネゴシエートを試みてエラーになった場合に返される。
507 Insufficient Storage WebDAVの拡張ステータスコード。リクエストを処理するために必要なストレージの容量が足りない場合に返される。
508 Loop Detected サーバ内でリダイレクトループに入ったときに返される。
開発中にたまによく見ます。
509 Bandwidth Limit Exceeded そのサーバに設定されている帯域幅(転送量)を使い切った場合に返される。
510 Not Extended An HTTP Extension Frameworkで定義されている拡張ステータスコード。拡張できない場合に返される。

まとめ

多いですね。

おおざっぱにいうと、200番台の数字は成功、300番台の数字は別のページ(もしくはブラウザ内のキャッシュ)への転送、400、500番台がエラーです。
(100番台はサーバが処理中の場合に返すようですが、滅多に使用されていない気がします。)
Webのエンジニアとしては、このエラーが少なくなるよう設計・運用するのですが、まかり間違ってエラーが出てしまうことがあります。

500番台のエラー(サーバ側のエラー)が出ている場合、エンジニアが裏でヒーヒーいっているんだろうなあというのがわかると、表示されないイライラが和らぐかもしれません。

おまけ

お気づきの方もいたかと思いますが、インターネットに関係なさそうなコードが一つ紛れ込んでいます。

 
418 I’m a teapot.

このコードは、ティーポットに対して「コーヒーを入れてください」というリクエストがきた場合に、ティーポットが返すためのエラーコードです。

インターネットの通信ルールで「RFC」というものがあり、ステータスコードはRFCの一つとしてIETF(Internet Engineering Task Force)という人たちが議論し策定されます。

ここのおっさんたちは毎年エイプリルフールにふざけたステータスコードを真顔で承認するのですが、それが実際に反映されています。
(実際に発行してみるとChromeではunusedになってました)

英語の、しかも理系ジョークなのであまりピンとこないのですが、RFCの中には、「伝書鳩通信に対応したインターフェースの定義」や「コーヒーポットを制御する際に用いられる通信規約」などが真面目な規約の合間にまぎれていますので、興味のある方は調べてみると楽しいですよ。

参考リンク

 


LIGでは、エンジニアを絶賛募集中!
http://liginc.co.jp/recruit/mid_career

この記事を書いた人

ふとし
ふとし バックエンドエンジニア 2014年入社
最近入社したぺーぺーです