HTTPステータスコードとヘッダー132種
404や500が何を意味するのか、Content-TypeやCache-Controlが何をするのかを一行でまとめました。
ステータスコード
1xx 情報4
進行中の知らせです。本当の応答はこの後に来ます。
2xx 成功10
要求が問題なく通ったという意味です。
200 OK要求が正しく処理されたという、いちばん多い応答です。201 Created新しい資源が作られたという意味です。Locationヘッダーにその場所が入ります。202 Accepted要求は受け付けたが、まだ処理していないという意味です。203 Non-Authoritative Information元のサーバーではなく中間のサーバーが手を加えた応答という意味です。204 No Content成功したが返す内容がないという意味です。保存後に画面をそのままにしたいときに使います。205 Reset Content成功したので入力フォームを空にするように、という意味です。206 Partial Content要求された一部だけを送ったという意味です。ダウンロードの再開や動画のシークがこれで動きます。207 Multi-Status複数の資源の結果をまとめて返すという意味です。208 Already Reported先に報告済みなので繰り返さないという意味です。226 IM Used要求された資源の変更分だけを送ったという意味です。
3xx 転送7
別の場所へ行くようにという意味です。恒久か一時かで分かれます。
300 Multiple Choices選べる資源が複数あるという意味です。301 Moved Permanently住所が恒久的に変わったという意味です。検索順位も新しいURLへ引き継がれます。302 Found今だけ別の住所へ行くように、という意味です。元の住所はそのまま残ります。303 See Other結果は別の住所からGETで受け取るように、という意味です。フォーム送信後に使います。304 Not Modified持っているものがまだ最新なのでそのまま使うように、という意味です。本文を送らないので速くなります。307 Temporary Redirect一時的に別の住所へ移るが、方式はそのままという意味です。308 Permanent Redirect恒久的に移すが、方式はそのままという意味です。
4xx 要求の誤り29
要求側に問題があるという意味です。同じものを送ればまた失敗します。
400 Bad Request要求そのものが壊れていて読めないという意味です。401 Unauthorized誰であるかを示していないという意味です。ログインすれば解けます。402 Payment Required支払いが必要という意味です。標準にはありますが実際にはあまり使われません。403 Forbidden誰であるかは分かっているが権限がないという意味です。ログインしても変わらないことがあります。404 Not Foundその住所には何もないという意味です。URLが違うか、すでに消えています。405 Method Not Allowedその住所はあるが、その方式は受け付けないという意味です。406 Not Acceptable要求された形式では返せないという意味です。407 Proxy Authentication Required中間のサーバーが先に認証を求めるという意味です。408 Request Timeout待ったが要求が最後まで届かなかったという意味です。409 Conflict今の状態とぶつかって処理できないという意味です。同時に編集したときに出ます。410 Gone意図的に消され、戻らないという意味です。404よりはっきりした別れです。411 Length Required本文の長さを示していないという意味です。412 Precondition Failed添えて送った条件が合わなかったという意味です。413 Content Too Large送った本文がサーバーの受け入れる大きさを超えたという意味です。414 URI Too Long住所が長すぎるという意味です。クエリを付けすぎたときに出ます。415 Unsupported Media Type送った本文の形式を扱えないという意味です。416 Range Not Satisfiable要求された範囲がファイルの外だという意味です。417 Expectation FailedExpectヘッダーに書いた期待に応えられないという意味です。418 I'm a teapotコーヒーを淹れてという要求をティーポットが断る、という冗談のコードです。421 Misdirected Requestこのサーバーが受けるべき要求ではないという意味です。422 Unprocessable Content形式は正しいが内容が規則に反していて処理できないという意味です。423 Lockedその資源が施錠されているという意味です。424 Failed Dependency先の要求が失敗したので、この要求もできないという意味です。425 Too Early再送の危険があるのでまだ処理しないという意味です。426 Upgrade Required別のプロトコルへ切り替えないと続けられないという意味です。428 Precondition Required条件を付けて送る必要があるという意味です。上書き事故を防ぐためです。429 Too Many Requests要求が多すぎるという意味です。Retry-Afterに再試行の時間が入ります。431 Request Header Fields Too Largeヘッダーが大きすぎるという意味です。クッキーがたまったときに出ます。451 Unavailable For Legal Reasons法的な理由で遮断されたという意味です。番号は小説『華氏451度』に由来します。
5xx サーバーの誤り11
サーバー側に問題があるという意味です。しばらくして試す価値があります。
500 Internal Server Errorサーバーの中で問題が起きたという意味です。要求に落ち度はありません。501 Not Implementedその機能をサーバーがまだ実装していないという意味です。502 Bad Gateway前のサーバーが後ろのサーバーからおかしな応答を受け取ったという意味です。503 Service Unavailable今はサーバーが要求を受けられないという意味です。点検や過負荷のときに出ます。504 Gateway Timeout前のサーバーが後ろのサーバーを待ちきれなかったという意味です。505 HTTP Version Not SupportedそのHTTPの版に対応していないという意味です。506 Variant Also Negotiatesサーバー設定の誤りで内容の選択が堂々巡りになるという意味です。507 Insufficient Storage保存する場所が足りないという意味です。508 Loop Detected処理中に同じところを堂々巡りしたという意味です。510 Not Extended要求にさらに拡張が必要という意味です。511 Network Authentication Requiredまずネットワークにログインする必要があるという意味です。公衆Wi-Fiでよく見かけます。
ヘッダー
リクエストヘッダー28
ブラウザーがサーバーへ送るときに付けるヘッダーです。
Acceptどの形式で受け取りたいかを伝えます。Accept-Encoding圧縮方式を伝えます。gzipやbrを使うと転送量が大きく減ります。Accept-Language希望する言語を伝えます。多言語サイトはこの値を見て選びます。Authorization身元を証明する値です。トークンやIDとパスワードが入ります。Cookie先にサーバーが置いたクッキーを送り返します。Hostどのドメイン宛ての要求かを示します。一台のサーバーが複数サイトを持てるのはこのためです。If-Modified-Sinceその時刻より後に変わっていたときだけ送るように求めます。If-None-Match持っているETagと違うときだけ送るように求めます。キャッシュはこうして確かめます。Origin要求の出どころを伝えます。ブラウザーが付け、CORSの判断の基準になります。Rangeファイルの一部だけを求めます。再開やシークはこれで実現します。Refererどのページから来たかを伝えます。綴りの誤りのまま標準になりました。User-Agentどのブラウザーと機器かを伝えます。今はほとんどが似たように偽装されています。Sec-Fetch-Destその要求が何に使われるか(画像かスクリプトか)を伝えます。Sec-Fetch-Mode要求が同一出所かCORSかを伝えます。Sec-Fetch-Site要求が同じサイトからか別のサイトからかを伝えます。DNT追跡しないでほしいという要求です。強制力がなくほとんど無視されます。Expect本文を送る前に、サーバーが受け取るかを先に尋ねます。Forwarded中継を経た要求の元の情報を記録します。From要求した人のメールアドレスを入れます。クローラーが連絡先として使います。If-Match持っているETagと同じときだけ処理するように求めます。上書き事故を防ぎます。If-Range条件が合えば続きから、合わなければ最初から受け取ります。Max-Forwards中間サーバーを何回まで経由してよいかを決めます。Proxy-Authorization中間サーバーに示す認証情報です。TE転送中にどの符号化を受け入れるかを伝えます。Upgrade-Insecure-Requestshttpのリンクもhttpsに変えてほしいという要求です。X-Forwarded-For中継を経た要求の元のIPを入れます。標準ではありませんが広く使われます。X-Forwarded-Proto元の要求がhttpだったかhttpsだったかを伝えます。X-Requested-WithJavaScriptからの要求であることを示していた古い慣習です。
レスポンスヘッダー30
サーバーがブラウザーへ返すときに付けるヘッダーです。
Access-Control-Allow-Originどの出所がこの応答を読んでよいかを決めます。CORSの中心です。Access-Control-Allow-Methods別出所からの要求に許す方式を並べます。Access-Control-Allow-Headers別出所からの要求に許すヘッダーを並べます。Access-Control-Allow-Credentialsクッキーを載せた別出所の要求を許すかを決めます。Access-Control-Max-Age事前要求の結果をどれだけ再利用してよいかを決めます。Ageこの応答がキャッシュにとどまっていた時間です。Allowその住所が受け付ける方式を伝えます。405と一緒に来ます。Content-Disposition画面で開くか保存するかを決めます。ファイル名もここに入ります。Content-Security-Policyどこから来たスクリプトや画像を実行・表示してよいかを決めます。XSSを防ぐ柵です。ETagその版の指紋です。中身が変わると値も変わり、キャッシュが気づきます。Expiresこの時刻を過ぎたら古いものとして扱うように、という意味です。Last-Modified最後に変わった時刻です。条件付き要求の基準になります。Location次に行く住所です。転送応答や201と一緒に来ます。Permissions-Policyカメラ・マイク・位置などの機能をどの文書が使えるかを決めます。Referrer-Policy出所の情報をどこまで送るかを決めます。Retry-Afterいつ再試行すればよいかを伝えます。429や503と一緒に来ます。Server応答したサーバーのソフトウェアを伝えます。詳しく書くと攻撃の手がかりになります。Set-Cookieブラウザーにクッキーを置きます。HttpOnlyとSecureを付けるのが安全です。Strict-Transport-Securityこれ以降このサイトへはhttpsだけで来るようブラウザーに刻みます。Timing-Allow-Origin別の出所が性能の計測値を読んでよいかを決めます。Vary同じ住所でもどのヘッダー次第で応答が変わるかを伝えます。キャッシュはこれを見て分けます。WWW-Authenticateどの方式で認証するかを知らせます。401と一緒に来ます。X-Content-Type-Options形式をブラウザーが勝手に推測しないようにします。X-Frame-Options他のサイトがこのページを枠に入れられないようにします。X-XSS-Protection古いブラウザーのXSSフィルターを有効にしていたヘッダーです。今はCSPが代わります。Cross-Origin-Opener-Policy別の出所が窓を握れないよう切り離します。Cross-Origin-Resource-Policyこの資源をどの出所が取得できるかを決めます。Cross-Origin-Embedder-Policy出所の違う資源を無断で取り込めないようにします。Content-Range送った断片が全体のどこに当たるかを伝えます。206と一緒に来ます。Accept-Ranges部分要求を受け付けるかを伝えます。bytesなら再開できます。
双方で使う13
要求にも応答にも付きうるヘッダーです。
Cache-Controlどれだけ長く、どこまでキャッシュしてよいかを決めます。性能の半分はここで決まります。Connection接続を続けるか切るかを伝えます。HTTP/2以降は使いません。Content-Encoding本文をどの方式で圧縮したかを伝えます。Content-Language本文がどの言語で書かれているかを伝えます。Content-Length本文が何バイトかを伝えます。Content-Type本文の形式と文字符号化を伝えます。これが誤ると画像が文字として表示されます。Dateメッセージを作った時刻です。Pragma古いキャッシュ制御のヘッダーです。今はCache-Controlが代わります。Trailer本文の後に続くヘッダー名を先に伝えます。Transfer-Encoding本文をどう分けて送るかを伝えます。chunkedなら長さを先に知らなくてもよくなります。Upgrade別のプロトコルへ切り替えようと提案します。101と対になります。Via経由した中間サーバーを記録します。Warningキャッシュや変換に関する注意を書いていたヘッダーです。現在は使いません。
読み方
- ステータスコードは最初の数字が意味を決めます。4なら要求側、5ならサーバー側の問題です。
- 404は「ない」、403は「あるが許されない」です。取り違えると原因探しに時間がかかります。
- ヘッダー名は大文字小文字を区別しません。Content-Typeとcontent-typeは同じヘッダーです。
- キャッシュやCORSの問題はたいていヘッダー一行で決まります。ブラウザーのネットワークタブでそのまま見られます。
よくある質問
Q. 404と403は何が違いますか。
404はその住所に何もないという意味で、403はあるけれど見る権限がないという意味です。ただし資源の存在自体を隠すためにわざと404を返すサーバーもあります。
Q. 500エラーのとき自分にできることはありますか。
5で始まるコードはサーバー側の問題なので、たいていは待つしかありません。ただし502や504は前段と後段のあいだの問題で、少し待って再試行すると解けることが多いです。
Q. 301と302はどう選びますか。
住所を完全に移したなら301、一時的に別へ送るなら302です。301はブラウザーも検索エンジンも長く覚えるため、取り消しにくい点に注意してください。
Q. ヘッダー名は大文字小文字を区別しますか。
区別しません。Content-Typeとcontent-typeは同じヘッダーで、HTTP/2以降は小文字で送ると定められています。
Q. CORSエラーはなぜ起きますか。
ページが別出所の応答を読もうとしたとき、サーバーがAccess-Control-Allow-Originで許可していなければブラウザーが遮ります。サーバーは応答していて、ブラウザーが本文をコードに渡さないだけなので、ネットワークタブには見えるのにスクリプトからは読めないという状態になります。