413 Content Too Large
使い方
413 Content Too Large のエラーメッセージを受け取った場合、クライアントはサーバーにとって大きすぎるリクエストボディを送信しています。よくある例は、クライアントが受け入れ可能な種類と形式のファイルを送信しようとしたものの、そのファイルがサイズ制限を超えている場合です。たとえば画像は不必要に高い解像度であることが多く、本来の用途に影響を与えずに大幅に小さくできます。サーバーは画像ファイルを変更する責任を負うのではなく、転送を拒否して必要な処理をクライアントに任せます。
こうした状況では、クライアントは PUT を開始する前に Expect: 100-continue ヘッダーを使ってファイルサイズの許容量を確認します。サーバーがそれに応答し、その結果に応じてメッセージボディが送信されるか見送られます。
サーバーは任意で、レスポンスに Retry-After ヘッダーを送ります。これが存在する場合、クライアントは指定された期間後、または指定された日時以降にリクエストを再試行します。たとえば、クライアントがその週のアップロード割り当てを超過した場合や、ピーク時間帯に大きなアップロードが許可されていない場合、サーバーはより適切な時間帯に再試行するよう提案します。
サーバーのストレージ容量が不足してこの状況が生じた場合、サーバーは代わりに 507 を送信します。
サーバーは、クライアントがメッセージボディを送信しないように接続を終了するため、Connection: close ヘッダーを含めます。
注意
WAF や CDN のファイアウォール(Cloudflare、AWS WAF)は、オリジンサーバーとは独立してボディサイズの制限を適用します。オリジンサーバーの制限がペイロードより大きい場合は、WAF やファイアウォールのログを確認してください。ペイロードサイズを削減する選択肢としては、Content-Encoding: gzip による圧縮、大きな結果セットに対するページネーションの実装、大きなファイルに対するマルチパートまたは再開可能なアップロードの利用があります。
SEO への影響
Google のような検索エンジンは、413 のレスポンスステータスを持つ URL をインデックスしません。以前にインデックスされていた URL は検索結果から削除されます。
例
クライアントがファイルを送信しようとしますが、現時点でトラフィックが多いため、サーバーは 413 Content Too Large で応答します。サーバーはリクエストを拒否し、接続を閉じて、30 分後に再試行するようクライアントに提案します。
リクエスト
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
レスポンス
HTTP/1.1 413 Content Too Large
Retry-After: 1800
Connection: close
Content-Type: text/html
Content-Length: 188
<html>
<head>
<title>File Too Large</title>
</head>
<body>
<p>Too much server traffic to accept the transfer
at this time. Try again after 30 minutes.</p>
</body>
</html>
対処方法
このエラーは、スタックの中で最初にサイズ制限を適用した層(Web サーバー、リバースプロキシ、CDN、アプリケーションフレームワーク)から発生します。413 を返している層を特定し、そこで制限を調整します。
nginx:http、server、location のいずれかのブロックで client_max_body_size を設定します。値を 0 にするとチェックが完全に無効になります(本番環境では推奨されません)。値を変更したら nginx を再起動します。
Apache:httpd.conf または .htaccess で LimitRequestBody を設定します。値はバイト単位なので、10 MB は 10485760 です。適用するには Apache をリロードします。
IIS:web.config ファイルの system.webServer > security > requestFiltering > requestLimits の下にある maxAllowedContentLength 属性を編集します。
PHP:php.ini で upload_max_filesize と post_max_size の両方を調整します。post_max_size の値は upload_max_filesize 以上でなければなりません。
Node.js / Express:body-parser または Express 組み込みの JSON/URL エンコードのミドルウェアで limit オプションを設定します。例:express.json({ limit: ‘50mb’ })。
Cloudflare:Free と Pro のプランはアップロードを 100 MB、Business は 200 MB、Enterprise は 500 MB に制限します。これらの制限を超えるアップロードは、オリジンに到達する前に 413 を返します。Cloudflare の背後で大きなファイルをアップロードする場合は、プロキシを迂回するか、チャンク化したアップロードの方式を使います。
クライアント側では、送信前に大きなペイロードを圧縮またはチャンク化します。ファイルアップロードでは、サーバーの制限内に収まるようマルチパートまたは再開可能なアップロードのプロトコルを実装します。完全なボディを送信する前にサーバーがそのペイロードサイズを受け入れるかを確認するには、Expect: 100-continue の仕組みを使います。
コードリファレンス
.NET
HttpStatusCode.RequestEntityTooLarge
Rust
http::StatusCode::PAYLOAD_TOO_LARGE
Rails
:payload_too_large
:request_entity_too_large
Go
http.StatusRequestEntityTooLarge
Symfony
Response::HTTP_REQUEST_ENTITY_TOO_LARGE
Python3.5+
http.HTTPStatus.REQUEST_ENTITY_TOO_LARGE
Java
java.net.HttpURLConnection.HTTP_ENTITY_TOO_LARGE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_REQUEST_TOO_LONG
Angular
@angular/common/http/HttpStatusCode.PayloadTooLarge