MeWrite Docs

413 Payload Too Large

HTTPリクエストのボディサイズが制限を超えた場合のエラー

概要

HTTPリクエストのボディサイズがサーバーの設定した制限を超えた場合に返されるステータスコードです。ファイルアップロードや大きなJSONデータの送信時によく発生します。

エラーメッセージ

HTTP/1.1 413 Payload Too Large
HTTP/1.1 413 Request Entity Too Large
nginx: client intended to send too large body

原因

  1. ファイルサイズ超過: アップロードファイルが制限を超えている
  2. JSONボディが大きい: POSTリクエストのボディが大きすぎる
  3. Base64エンコード: 画像をBase64でエンコードしてサイズが増大
  4. サーバー設定: Nginx/Apache/アプリケーションの制限
  5. CDN/プロキシ: CloudFrontやCloudflareの制限

解決策

1. Nginxの設定

1
2
3
4
5
6
7
8
9
# nginx.conf または server block
http {
    client_max_body_size 100M;  # 100MBに設定
}

# または location block で
location /upload {
    client_max_body_size 500M;
}

2. Apacheの設定

1
2
3
4
5
6
# .htaccess または httpd.conf
LimitRequestBody 104857600  # 100MB (バイト単位)

# または php.ini で
upload_max_filesize = 100M
post_max_size = 100M

3. Express.jsの設定

1
2
3
4
5
6
7
8
const express = require('express');
const app = express();

// JSONボディの制限
app.use(express.json({ limit: '50mb' }));

// URLエンコードの制限
app.use(express.urlencoded({ limit: '50mb', extended: true }));

4. Laravelの設定

1
2
3
4
5
6
7
8
9
// php.ini
upload_max_filesize = 100M
post_max_size = 100M
memory_limit = 256M

// バリデーションで制限
$request->validate([
    'file' => 'required|file|max:102400', // 100MB in KB
]);

5. AWS API Gateway

1
2
3
4
5
6
7
# SAM template
Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      # API Gatewayのデフォルト制限は10MB
      # より大きなファイルはS3署名付きURLを使用

6. クライアント側で分割アップロード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
async function uploadLargeFile(file, chunkSize = 5 * 1024 * 1024) {
  const chunks = Math.ceil(file.size / chunkSize);

  for (let i = 0; i < chunks; i++) {
    const start = i * chunkSize;
    const end = Math.min(start + chunkSize, file.size);
    const chunk = file.slice(start, end);

    const formData = new FormData();
    formData.append('chunk', chunk);
    formData.append('chunkIndex', i);
    formData.append('totalChunks', chunks);
    formData.append('fileName', file.name);

    await fetch('/api/upload-chunk', {
      method: 'POST',
      body: formData
    });
  }
}

7. S3署名付きURLを使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// サーバー側: 署名付きURLを生成
const AWS = require('aws-sdk');
const s3 = new AWS.S3();

async function getUploadUrl(fileName, contentType) {
  const params = {
    Bucket: 'my-bucket',
    Key: `uploads/${fileName}`,
    ContentType: contentType,
    Expires: 3600 // 1時間有効
  };

  return s3.getSignedUrl('putObject', params);
}

// クライアント側: 直接S3にアップロード
async function uploadToS3(file) {
  const { uploadUrl } = await fetch('/api/upload-url').then(r => r.json());

  await fetch(uploadUrl, {
    method: 'PUT',
    body: file,
    headers: {
      'Content-Type': file.type
    }
  });
}

8. 圧縮して送信

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pako from 'pako';

async function sendCompressedData(data) {
  const jsonString = JSON.stringify(data);
  const compressed = pako.gzip(jsonString);

  await fetch('/api/data', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Content-Encoding': 'gzip'
    },
    body: compressed
  });
}

各サービスの制限

サービスデフォルト制限
Nginx1MB
Apache無制限(PHPは2MB)
Express.js100KB
API Gateway10MB
CloudFront20MB(Lambda@Edge連携時)
Cloudflare100MB(プランによる)

よくある間違い

  • Nginxとアプリケーション両方の設定を変更し忘れる
  • Base64エンコードでサイズが約33%増加することを忘れる
  • CDN/プロキシの制限を見落とす
  • 複数のミドルウェアで制限がかかっている

関連エラー

参考リンク

HTTP の他のエラー

最終更新: 2025-12-13