Slate Errors

Client Error

421

Misdirected Request

— 宛先が違います

まずは確認: よくある原因 TOP3

  1. HTTP/2 のコネクション再利用で誤ったホストに到達
    同じ TLS 接続を使い回した結果、別ドメインのリクエストが流入
  2. ロードバランサや CDN のルーティング設定
    SNI と Host ヘッダの不一致で振り分けが正しく行われない
  3. 共有 IP のホスト指定ミス
    仮想ホスト構成で、Host ヘッダがどこにも対応していない

何が起きたのか?

421 は「あなたが届けた手紙、ここの教室宛じゃないですよ」というサインです。 教室で言えば、提出物を持って隣の教室に入ってしまい「うちはそのクラスじゃないよ、向かいの部屋だよ」と返される——そんな場面に近いです。サーバーは存在しますが、そのリクエストを処理する責任を持っていません。

HTTP/2 や HTTP/3 では、同じ接続を複数のドメインで使い回すことができます。その仕組みが噛み合わないと、本来は別のサーバーが応えるべきリクエストが、たまたま開いている接続を通じて来てしまう。サーバーはそれに気付いて 421 で返します。

黒板からのひとこと

学校に同じ名前の先生が二人いると、生徒は誤って違う先生の教室に質問を持ち込むことがあります。「同じ名字でも、僕じゃなくて隣の教室の先生のほうだよ」と教えてもらえれば、生徒は素直に出直せます。

421 もそれと同じで、サーバーは「この接続では応えられないけれど、新しく接続し直せば届くはずだよ」と教えてくれています。クライアントは別の接続でやり直せば、たいてい解決します。

解決への歩み

大丈夫、次はこうしてみよう:

  1. 接続を張り直して再送:HTTP クライアントが既存接続を使い回さないよう設定
  2. Host / :authority ヘッダの値を確認:意図した宛先を正しく指定しているか
  3. CDN / LB のルーティングを確認:振り分けルールと TLS 証明書の対象ドメインの整合
  4. 仮想ホスト設定を確認(管理者向け):SNI、ALPN、ホストごとのバックエンド指定を順に点検

実際にはこう見える

$ リクエスト

curl -i https://example.com/some/path

↓ レスポンス

HTTP/1.1 421 Misdirected Request
Content-Type: text/html; charset=utf-8

<!DOCTYPE html>
<html><body><h1>421 Misdirected Request</h1></body></html>

似ているケース

もっと知りたい