Slate Errors

Client Error

411

Length Required

— Content-Length が必要です

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

  1. クライアントが Content-Length を付け忘れた
    自作のリクエスト送信処理で、ヘッダ計算が抜けていないか
  2. チャンク転送 (Transfer-Encoding) を許可していないサーバー
    HTTP/1.0 互換のサーバーは長さ必須のことが多い
  3. プロキシ経由でヘッダが落ちた
    中継のプロキシが Content-Length を削っている可能性

何が起きたのか?

411 は「届いた荷物に『中身は何ページ分です』というラベルが付いていない」というサインです。 教室で言えば、ノートを提出するときに表紙へ「全 12 ページ」と書く決まりなのに、その表記が抜けていた——そんな状況に近いです。サーバーは中身を読みに行く前に「長さが分からないと受け取れない」と止めます。

多くの場合、HTTP/1.1 のチャンク転送に対応していない古めのサーバーや、厳しいプロキシ設定で起きます。Content-Length ヘッダを付ければ素直に通ることがほとんどです。

黒板からのひとこと

授業で配られる回覧物には、よく「全 3 枚」と表紙に書かれています。これがあると、途中で 1 枚だけ落ちたときにすぐ気づけるし、受け取った側も確認しやすい。先生は安心して回覧を回すことができます。

411 もそれと同じで、「長さの宣言」があると、サーバーは中身を読みながら「ちゃんと最後まで届いた」と判断できます。チャンク転送が使えない相手には、明示的に長さを書いて渡す——そのひと手間が必要というだけです。

解決への歩み

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

  1. Content-Length ヘッダを付ける:ボディのバイト数を計算してリクエストに含める
  2. チャンク転送をやめるTransfer-Encoding: chunked を外し、バッファして送る
  3. ライブラリのバージョンを確認:HTTP クライアントが意図通りヘッダを送っているか
  4. プロキシ・サーバー設定を確認(管理者向け):チャンク転送を許可するか、HTTP/1.1 互換性を整える

実際にはこう見える

$ リクエスト

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

↓ レスポンス

HTTP/1.1 411 Length Required
Content-Type: text/html; charset=utf-8

<!DOCTYPE html>
<html><body><h1>411 Length Required</h1></body></html>

似ているケース

もっと知りたい