Content-Length ヘッダーが必要です。
使いどころ
サイズが宣言されていないアップロード。
よくある原因と対処法
サーバーが、ボディはあるのに Content-Length ヘッダーがないリクエストを拒否しています。クライアントが Transfer-Encoding: chunked でストリーミングし、サーバーやプロキシがチャンク形式のアップロードを拒否する場合や、ボディも長さもない POST を送った場合に発生します。Google Cloud Storage や一部の古いサーバーは、空の POST リクエストに Content-Length: 0 を求めることで知られています。
クライアント側で修正します。ライブラリが長さを設定できるようボディをバッファリングするか、自分でヘッダーを設定してください。curl -d は Content-Length を自動で設定しますが、データなしの curl -X POST は何も送らないので、-H Content-Length:0 を追加します。HTTP/2 と HTTP/3 ではフレームがボディの終わりを示すため、この問題は HTTP/1.1 特有です。nginx はバージョン 1.3.9 からチャンク形式のリクエストボディを受け付けています。
クライアントエラー (4xx)
4xx はクライアントエラーです。リクエスト自体が誤っている、認証されていない、または存在しないものを指しています。同じリクエストを再試行しても解決しません。
レスポンスでの表示
HTTP/1.1 411 Length Required返し方
| Node.js / Express | res.status(411).end() |
|---|---|
| Python / Flask | return '', 411 |
| nginx | return 411; |
確認方法
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/