ByteScope

HTTP ステータスコード

各 HTTP ステータスコードの意味と、フロントエンド・バックエンド・利用者がそれぞれ何をすればいいか。

ファイルはブラウザから送信されません — 処理はすべてローカルで行われます。

返ってきたコードから入ってください。どのページも、仕様が何と言っているかと、あなたが実際に何をすればいいかを分けて書いていて、フロントエンド・バックエンド・ただページを開きたかった人の 3 つを別々の問題として扱います。

クラスで絞り込む
コード名称クラス意味
301Moved Permanently3xx古い URL は退役し、`Location` に入っている URL がその座を引き継ぎます。しかも 301 は、何も指示しなくてもキャッシュが保存してよい数少ない応答の一つなので、間違って出した 301 はいちばん取り消しにくいリダイレクトになります。
302Found3xx一時的な迂回です。リソース自体は要求した URL のままそこにあるけれど、今回だけは別の場所から返したい——という意味で、しかもブラウザはその迂回をあなたのコードに見せないまま辿ります。
304Not Modified3xx手元のコピーはまだ有効です。リクエストに検証子を添えて送り、サーバーが自分の持っているものと比べ、一致したので、ヘッダーだけを返してボディを意図的に省いた——それが 304 です。
400Bad Request4xxサーバーがリクエストの解釈自体を拒みました。リクエスト行・ヘッダー・メッセージの区切り・ボディのどこかが壊れているか大きすぎるということで、たいていの場合、アプリケーションのコードは 1 行も走っていません。
401Unauthorized4xxリクエストが使える認証情報を運んでいませんでした。理由句は Unauthorized ですが、実際に表しているのは「未認証」の状態で、しかも何を出せば通るのかを示すヘッダーの添付は必須です。
403Forbidden4xxサーバーはリクエストの意味を完全に理解したうえで、実行を拒んでいます。しかも 401 と違って、何を出せば通ったのかを説明するヘッダーを添える義務はありません。
404Not Found4xxサーバーはリクエストの意味を理解したうえで、そのパスに出せるものを何も持っていません。今どきの構成では、リンク切れよりもルーティングかデプロイの取りこぼしであることのほうがずっと多いコードです。
405Method Not Allowed4xxパスは存在しますし、サーバーはそのメソッド自体も知っています。ただ、ここではそのメソッドを受け付けない——そして受け付けるメソッドの一覧を渡すことが義務づけられています。
429Too Many Requests4xxレート制限が「頼みすぎだ」と判断しました。プロトコルの表明ではなくポリシーの表明なので、429 を返す 2 つのサービスがまったく別のものを数えていることもあります。
500Internal Server Error5xxアプリケーション自身が動いて、想定していなかった何かに当たって諦めた——という意味です。だから 502 や 504 と違って、どこかにスタックトレースが必ずあります。仕事はそれがどのログにいるかを見つけることです。
502Bad Gateway5xxアプリケーションの手前にいるプロキシが、代わりに返した答えです。アプリケーション自身の応答が来なかったか、途中で切れたか、HTTP として成立していなかったことを意味します。
503Service Unavailable5xx何かが意図的に、そして「今は」応じないことを決めました。メンテナンスページ、レート制限、あるいは健全な転送先を一つも持たないロードバランサー——だから 503 は、5xx で唯一「期限」が付いてくるコードです。
504Gateway Timeout5xxプロキシが上流を待ち、しびれを切らして代わりに答えました。だから犯人を特定する数字はステータスコードではなく経過時間のほうです。それは必ず誰かが設定したタイムアウトです。
521Web Server Is Down非標準5xxIETF ではなく Cloudflare 独自のコードで、5xx の中でいちばん狭い失敗を表します。オリジンが Cloudflare の TCP 接続を能動的に拒否した——遅かったのでも、経路を間違えたのでもなく、何かが「駄目だ」と言ったのです。
524A Timeout Occurred非標準5xx中まで届いたのに、そこで黙ってしまったリクエストのための Cloudflare 独自のコードです。接続は成功し、オリジンはリクエストを受け取り、それでも 125 秒後に返せる HTTP 応答がまだ無かった、という意味です。

このツールについて

三桁の数字を渡された、その瞬間のために ステータスコードを興味本位で調べる人はほとんどいません。デプロイした途端にリクエストの半分が赤くなった、誰も再現できないエラーを顧客が報告してきた、監視のアラートが三桁の数字だけを引用してきた——調べる理由はたいていそれです。だからこのリファレンスは、そのコードが「障害はどこにあるか」について何を教えてくれるかから始めて、仕様の話はその後にします。定義は短いほうの話で、ルーターを見るのかプロキシを見るのか上流を見るのかを決めるほうが、午後をまるごと持っていきます。

読み手が 3 人いれば、答えも 3 つ フロントエンド開発者が見る 404 は、たいてい「クリックでは開くのにリロードで壊れるルート」です。同じ 404 をバックエンド開発者が見ると、たいてい「アプリケーションがパスを見る前に足された、あるいは剥がされたプロキシの接頭辞」です。利用者にとっては、移動したリンクです。これは 3 つの別々の問題で、直し方も 3 つあります。1 つの段落に混ぜたページは 3 人の誰の役にも立たないので、ここではコードごとに 3 つを分けて書き、そのうちの誰かにとっての正直な答えが「やることは何も無い」であるときは、そうはっきり書きます。

標準か、ベンダー独自か、ただの慣習か RFC 9110 は、準拠したクライアントとサーバーが解釈を共有するステータスコードを定義しています。よく使われるもののいくつかは別の文書にいて、429 は RFC 6585、308 は RFC 7538 です。そして本番で出会うコードには、そのどちらでもないものが相当あります。499 は nginx のソースから来ていますし、520 から 526 の帯は丸ごと Cloudflare のもので、エッジとオリジンの間の失敗が一般的な 502 として報告されないために作られました。どのページも自分がその 3 つのどれなのかを明記します。どこのドキュメントが権威なのかがそれで決まるからです——そしてこのサイト自体が Cloudflare の上で動いているので、52x のページはあなたと同じ側から書かれています。

よくある質問

ステータスコードのクラス(1xx〜5xx)は何を表していますか?

最初の 1 桁がその分類そのものです。1xx は情報提供でアプリケーションのコードに出てくることはまれ、2xx はリクエストの成功、3xx は追加の動作——たいていはリダイレクトを辿ること——が必要という意味、4xx はリクエスト自体に不備があったという意味、5xx は正当に見えるリクエストを処理する途中でサーバー側が失敗したという意味です。RFC 9110 は、知らないコードに出会ったクライアントはそのクラスの x00 として扱わなければならない、とも書いています。だから見慣れない 599 は 500 として処理して構いません。

実際に返ってきたステータスコードはどう確認しますか?

ブラウザなら、開発者ツールのネットワークパネルで、読み込まれたアセットではなくリクエスト自身の Status 列を読みます。ターミナルなら curl -sS -o /dev/null -w '%{http_code}\n' https://example.com/page が数字だけを出し、-D - を足せば応答ヘッダーも一緒に出ます。両者が食い違ったときに信じるべきはターミナルのほうです。拡張機能、Service Worker、キャッシュされた応答のどれもが、ブラウザの表示を変えてしまえるからです。

4xx は自分のせい、5xx は相手のせい、で合っていますか?

その分け方が意図ではありますが、保証ではなく目安です。設定を間違えたサーバーが出す 4xx はいくらでもあります——パスを壊したプロキシが返す 404、誰も当てるつもりのなかったルールが返す 403。逆に、要求しすぎたリクエストが引き金になる 5xx も同じくらいあります。クラスは「どちら側から先に見るか」を決めるために使うもので、誰が悪いかを決めるためのものではありません。

この中で本当は標準ではないコードはどれですか?

418 はエイプリルフールの RFC から来た冗談で、それでも返すサーバーが実在します。499 は IANA にそもそも登録がなく、nginx 由来で「サーバーが答える前にクライアントが接続を閉じた」という意味なので、ブラウザではなくアクセスログに現れます。520 から 526 は Cloudflare 独自で、定義しているのは Cloudflare のドキュメントだけです。429 は後付けのように感じますが RFC 6585 という正式な標準で、308 も RFC 7538 の標準です。

ステータスコードは SEO に影響しますか?

決定的に影響するものがあります。301 は評価を新しい URL へ引き継ぎますが、302 はクローラーに「移動は一時的なので古いほうを保持しろ」と伝えるので、恒久的な移動に 302 を使うと静かに損をします。404 はしばらく再クロールを招き、410 は索引に「このリソースは終わった」と伝えます。最悪なのは soft 404——200 で返されるエラーページ——で、検索エンジンはその謝罪文を本文として索引に入れてしまいます。