脳みそスワップアウト

揮発性なもので。おもにPHPのこととか。

HTTPステータスコード 4xx系 クライアント側エラー

 

400 (Bad Request)
不正な形式,無意味なデータをクライアントが送信してきた場合。
クライアント側の汎用エラーなので,他の4xx系が使えなければこれ。

必要あればbodyにエラーメッセージを付ける。

401 (Unauthorized)
認証情報がない・正しくない。
WWW-Authenticateヘッダにクライアントへの指示を設定,ヒントを与えるべき。
bodyにはエラードキュメント。ヒントのHTMLでもいい。

402 (Payment Required)
予約。規定されていない。

403 (Forbidden)
アクセス拒否
但し,これはリソースが存在することを暗黙のうちに公表している。404も検討すべき。

単に認証情報が不足している場合は401なので,。
特定IPや時間帯による制限に使う方がいいのだろう。

bodyには拒否された理由のドキュメント。必須ではない。

404 (Not Found)
リソースがない場合。
とくに,クライアントがどのリソースを要求しているのかをサーバ側がわからない場合。

同時に,このURIが空いていることも示しているのだが,
403(Forbidden)や401(Authentication Required)を隠すための嘘である可能性もあることに注意。

405 (Method Not Allowed)
このリソースがサポートしていないHTTPメソッドを使った場合。
Allowヘッダにはサポートするメソッドのリストを付ける。

Allow: Get,Post

406 (Not Acceptable)
Accept-*の内容に制限が多すぎて,表現を返せない場合。

無視して優先度の高い表現を200とともに返すことが多いためあまり使われない。
bodyは有効な表現のリンクのリスト。

407 (Proxy Authentication Required)
proxyサーバの場合のみ。
認証をクリアしなければproxyが使えないことを示す。
Proxy-Authorizationヘッダのついたリクエストと併用される。

Proxy-Authenticateヘッダに,期待する認証の情報をつける。
407をクリアしたあと,401に引っかかる可能性があるがこの挙動に問題はない。

408 (Request Timeout)
あまり使わない。
コネクション確立後,全然リクエストが送られてこないのであれば,
これを返して接続閉じる必要がある。
アプリのレイヤではあまり使わなさそう。

409 (Conflict)
すでにリソースが存在する場合。
何らかの競合・矛盾が起きてしまう場合にこれを返す。

Locationに競合の原因であるURIをポイントする。
bodyにはドキュメントを。必須ではないがあったほうがいいと思う。

410 (Gone)
リソースがない場合。
以前にはそこにリソースがあったが,現在はもう存在しないことをわかっており,
かつ新しいURIを知らない場合。もし知っているのなら301である。

301同様,永続的な扱いである。

411 (Length Required)
Content-Lengthヘッダのないリクエストを許可しない場合。

412 (Precondition Failed)
リクエストヘッダで事前条件を指定されたものの,その条件が満たされなかった場合。

主にIf-Unmodified-SinceをつけたPUTで使う。

If-Match, If-None-Match, If-Unmodified-Sinceのいずれかのヘッダを持つリクエストと併用する。
但し,If-None-MatchのGETとHEADが満たされなかった場合だけは304である。

413 (Request Entity Too Large)
データが大きすぎてサーバが処理できないことを示す。

クライアント側がこのエラーを気にする場合は,先にExpect付きで送って
100が得られるかどうかを確認するという方法がある。

Retry-Afterヘッダに日時や秒数を指定することができる。
一時的な問題だった場合などにはこれを付ける。

414 (Request-URI Too Long)
あまり使わない。
HTTPの仕様ではURIの長さに制限はないが,webサーバで制限がある場合がほとんど。
サービスもそれに倣うなら使うのだろう。

415 (Unsupported Media Type)
理解できないメディアタイプで送られてきた場合。
より汎用的な400を使ってしまってもいい。

416 (Requested Range Not Satisfiable)
あまり使わない。
範囲がリソース自体よりも大きいなど,部分GETで範囲が適用できない場合。

Range付きのリクエストと併用される。
If-Rangeが付いていた場合は送信されない。

Content-Rangeにリソースの実際のサイズをつける。

417 (Expectation Failed)
100の逆。