ホーム>Laravel>【Laravel】413 (payload too large) が出た時の対処法
Laravel

【Laravel】413 (payload too large) が出た時の対処法

いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。

LaravelでPOST・ファイルアップロード時に413 (payload too large) エラーが出る原因と、php.iniでの上限設定の変更方法についてまとめました

エラー文

ファイルアップロードなど、サイズの大きい POST リクエストを送ると、次のようなエラーが返ってくることがあります。

413 Payload Too Large
413 Request Entity Too Large

自分の場合、プロジェクトを作るたびに目にするエラーです。

原因(ファイルサイズが上限を突破しているため)

サーバー(ローカル・本番問わず)には、「POST で送信できるデータの上限」「アップロードできるファイルサイズの上限」が設定で決まっています。

これが無制限だと、極端に大きいファイルを送りつけられただけでサーバーが落ちてしまうため、デフォルトである程度小さめの上限が設定されています。

PHP の場合、この上限は php.ini の以下の 2 つの値で決まります。

upload_max_filesize
post_max_size
  • upload_max_filesize: アップロードできる 1 ファイルあたりの最大サイズ
  • post_max_size: POST リクエスト全体(ファイル+その他のフォームデータ)の最大サイズ

送りたいファイルのサイズがこのどちらかを超えていると、413 エラーになります。

現在の上限を確認する方法

phpでは、関数が用意されており、以下のコードでサーバーの設定を確認することができます。

<?php phpinfo() ?>

エラーが起きているページの、Blade ファイルに書いてみてください。

ページを開くと、PHP のサーバー情報がずらっと表示されます。

その中から

  • upload_max_filesize
  • post_max_size
  • Loaded Configuration File ← 設定ファイルの場所

を探してください。

現在の設定値が確認できます。

upload_max_filesize	30M	30M
post_max_size	30M	30M
/usr/local/etc/php/7.4/php.ini

解決方法(実際に解決した方法)

私は動画ファイルなどサイズの大きいファイルを扱うことが多いため、上限を余裕を持って 30M に変更して解決しました。

先ほど確認した設定ファイルのパスを使います(2020 年当時の私の環境では PHP7.4 を使っておりますが、PHP のバージョンが変わってもやり方は同じです)

ファイルのパスは PHP のバージョンによって変わるので、ご自身の phpinfo()Loaded Configuration File に表示されたパスに読み替えてください。

編集する項目は 2 箇所だけなので、ターミナルから Vim で直接書き換えました(以下は当時の環境でのパス例です)。

vim /usr/local/etc/php/7.4/php.ini

Vim を開いたら、

  1. 閲覧モードのまま / を押して検索モードに入り、/upload_max_filesizeを探す
  2. upload_max_filesizeが見つかったら、a キーで編集モードにして数値を書き換える(8M→30M)
  3. ESC キーで閲覧モードに戻る
  4. / を押して検索モードに入り、 post_max_size を探す
  5. post_max_sizeが見つかったら、a キーで編集モードにして数値を書き換える
  6. ESC キーで閲覧モードに戻る
  7. :wqを入力し、保存・終了する
  8. ローカルサーバー(または EC2 などのサーバー)を再起動する

最後に、phpinfo() を出力しているページを再読み込みし、数値が変わっていれば設定変更は成功です。

ローカル環境(PHP 内蔵サーバーなど)であれば、これで 413 エラーは解消しました。

参考:本番環境(nginx/Apache)の場合

私自身はローカル環境での対応のみ確認していますが、調べたところ、本番環境で nginx や Apache をリバースプロキシとして使っている場合は、php.ini の設定に加えて、Web サーバー側にも別途アップロード上限の設定があるようです。

nginx の場合、client_max_body_size という設定項目がこれにあたるとのことです。

client_max_body_size 30M;

php.ini だけ変更しても nginx 側の上限に引っかかっていると 413 エラーのままになるらしいので、本番環境で解決しない場合はこちらも確認すると良さそうです。

Apache の場合は LimitRequestBody という設定項目があるようです。

LimitRequestBody 31457280

(Apache はバイト単位で指定するため、30MB の場合は 30 * 1024 * 1024 = 31457280 のように計算するとのことです。)

設定変更後は、nginx/Apache ともに再起動が必要とのことです。

Docker の設定ファイルの場合

このプロジェクトのディレクトリ構成的は、

project/
└── docker/
    └── app/
        ├── Dockerfile
        └── php.ini

です。

Dockerfileに設定ファイルの変更を書く場所を作ります。

COPY ./docker/app/php.ini /usr/local/etc/php/php.ini

./docker/app/php.iniの部分は、ご自身のディレクトリ構成に合わせて変更してください。

./docker/app/php.ini

upload_max_filesize = 30M
post_max_size = 30M

docker compose up -d で再起動して反映されていれば OK です。

AI チャットに質問する際に添付すると良い情報

コマンドを実行できない AI チャット(ChatGPT・Claude chat など)に質問する場合、以下の情報を貼り付けて質問すると、的確な回答が得やすくなります。

  • エラーメッセージ全文(ブラウザの開発者ツールの Network タブに表示されるレスポンス内容も含めて)
  • アップロードしようとしているファイルのサイズ
  • phpinfo() で確認した upload_max_filesize / post_max_size の現在値
  • 実行環境(ローカルの PHP 内蔵サーバーか、nginx/Apache 経由の本番環境か)
  • 本番環境の場合、リバースプロキシ(nginx/Apache)を使っているかどうか、使っている場合はその設定ファイルの該当箇所
  • Docker を使っている場合は Dockerfile や docker-compose.yml の PHP 関連設定
  • どこで 413 エラーが発生しているか(フォーム送信時か、Laravel のバリデーション実行前か)

特に「ファイルサイズ」と「実行環境(ローカル/本番、リバースプロキシの有無)」の 2 つは、原因の切り分けにほぼ必須です。

まとめ

413 エラーは、PHP の upload_max_filesize / post_max_size のどちらか(または両方)を、送りたいファイルサイズが超えてしまっていることが原因です。

phpinfo() で現在の上限を確認し、php.ini を編集して上限を引き上げれば解決します。

本番環境で nginx や Apache をリバースプロキシとして使っている場合は、Web サーバー側にも別途上限設定があるため、php.ini を変更しても直らない場合はそちらも確認してみてください。

フィードバックのお願い
この記事のフィードバックがありましたらYoutubeの適当な動画にコメントしていただいたり、お問い合わせからご連絡ください。