何が起きたのか?
411 は「届いた荷物に『中身は何ページ分です』というラベルが付いていない」というサインです。 教室で言えば、ノートを提出するときに表紙へ「全 12 ページ」と書く決まりなのに、その表記が抜けていた——そんな状況に近いです。サーバーは中身を読みに行く前に「長さが分からないと受け取れない」と止めます。
多くの場合、HTTP/1.1 のチャンク転送に対応していない古めのサーバーや、厳しいプロキシ設定で起きます。Content-Length ヘッダを付ければ素直に通ることがほとんどです。
黒板からのひとこと
授業で配られる回覧物には、よく「全 3 枚」と表紙に書かれています。これがあると、途中で 1 枚だけ落ちたときにすぐ気づけるし、受け取った側も確認しやすい。先生は安心して回覧を回すことができます。
411 もそれと同じで、「長さの宣言」があると、サーバーは中身を読みながら「ちゃんと最後まで届いた」と判断できます。チャンク転送が使えない相手には、明示的に長さを書いて渡す——そのひと手間が必要というだけです。
解決への歩み
大丈夫、次はこうしてみよう:
- Content-Length ヘッダを付ける:ボディのバイト数を計算してリクエストに含める
- チャンク転送をやめる:
Transfer-Encoding: chunkedを外し、バッファして送る - ライブラリのバージョンを確認:HTTP クライアントが意図通りヘッダを送っているか
- プロキシ・サーバー設定を確認(管理者向け):チャンク転送を許可するか、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>