2026年8月26日
2026年8月26日
Apacheのリクエストサイズ制限設定(LimitRequestBodyと413エラーの対処)
Apacheで受け付けるリクエストの大きさは、本文(アップロードやフォーム送信の中身)を LimitRequestBody、ヘッダーやURLの長さを LimitRequestFieldSize・LimitRequestLine などで制限します。WordPressで大きなファイルをアップロードできない場合、原因はApacheだけでなく、PHPの設定や前段のプロキシにあることも多いため、どこで止められているかを見分けてから値を変えるのが近道です。この記事では、各ディレクティブの意味と既定値、設定する場所、WordPressのアップロード上限との関係、413エラーの切り分け方を説明します。
リクエストサイズに関わるディレクティブ
Apache本体(core)には、リクエストの大きさを制限するディレクティブがいくつかあります。
| ディレクティブ | 制限する対象 | 超えたときの応答 |
|---|---|---|
LimitRequestBody |
リクエスト本文のバイト数 | 413 |
LimitRequestFieldSize |
ヘッダー1行あたりのバイト数 | 400 |
LimitRequestFields |
ヘッダーの行数 | 400 |
LimitRequestLine |
リクエスト行(メソッド+URL)の長さ | 414 |
WordPressの運用で調整することが多いのは LimitRequestBody です。ヘッダー側の制限は、Cookieが肥大化したときや、極端に長いクエリ文字列を使うときに問題になります。
LimitRequestBodyの既定値に注意
LimitRequestBody の既定値は、Apache 2.4.54以降で1GiB(1073741824バイト)になりました。それより前のバージョンでは0(無制限)でした。古い解説記事に「既定では無制限」と書かれているのはこのためです。手元のバージョンは apachectl -v(Ubuntuでは apache2ctl -v)で確認できます。主要なディストリビューションが現在提供している2.4系の多くは変更後のバージョンですが、パッケージによって差があるので、自分の環境で確かめてください(2026年10月現在)。
通常のWordPressサイトで1GiBを超えるアップロードを扱うことはまれなので、既定値のままで困ることは多くありません。むしろ、不要に大きな本文を受け付けない方向で、場所を絞って小さい値を設定する使い方が有効です。
設定する場所と書き方
LimitRequestBody は、サーバー全体、バーチャルホスト、<Directory> や <Location> の中、.htaccess に書けます。値はバイト数で指定し、0は無制限を意味します。
# バーチャルホスト全体で上限を64MBにする
<VirtualHost *:443>
ServerName example.com
LimitRequestBody 67108864
# ログインページは大きな本文を受け付ける必要がないので小さくする
<Files "wp-login.php">
LimitRequestBody 102400
</Files>
</VirtualHost>
ここで <Files> を使っているのは、.htaccess の書き換えルールを経由しても、最終的に実行されるファイル名で照合されるからです。ログインページを小さく制限する例は、大きな本文を送りつけるリクエストを早い段階で断るためのものです。プラグインによってはログインフォームに追加の項目を送るものもあるので、設定後はログインと、利用しているセキュリティ系プラグインの動作を確かめてください。
設定を変えたら、文法を確認してから再読み込みします。
sudo apachectl configtest
sudo systemctl reload apache2 # RHEL系は httpd
ヘッダーとURLの制限
LimitRequestFieldSize と LimitRequestLine の既定値は、どちらも8190バイトです。LimitRequestFields の既定値は100行です。ブラウザに「Size of a request header field exceeds server limit」と表示される400エラーは、多くの場合Cookieが大きくなりすぎたことが原因です。同じドメインに多数のCookieを発行するツールを入れていないか、まずブラウザのCookieを削除して再現するかを確かめます。
値を大きくすることもできますが、ヘッダーの上限は <VirtualHost> の中で変えても、最初に受け付けたバーチャルホスト(そのポートの既定のサーバー)の値が使われる場合があります。サーバー全体の設定で変えるほうが分かりやすくなります。
# apache2.conf または httpd.conf
LimitRequestFieldSize 16380
上限を上げるほどメモリを多く使う余地を与えることになるので、原因を確かめずに大きくするのは避けてください。
WordPressのアップロード上限との関係
WordPressのメディア画面に表示される「最大アップロードサイズ」は、Apacheではなく、主にPHPの設定から決まります。WordPressの wp_max_upload_size() は、PHPの upload_max_filesize と post_max_size の小さいほうを上限として扱います。そのため、Apacheの LimitRequestBody を大きくしても、PHPの値が小さければ表示は変わりません。
大きなファイルを扱いたい場合は、次の値をそろえて調整します。
; php.ini(PHP-FPMなら fpm 用の php.ini、またはプールの設定)
upload_max_filesize = 64M
post_max_size = 72M
memory_limit = 256M
max_input_time = 300
post_max_size は、ファイル本体に加えてフォームの他の項目も含んだ本文全体の上限なので、upload_max_filesize より少し大きくしておきます。Apacheの LimitRequestBody はさらにその上に置くと、制限の順番が分かりやすくなります。
PHPの設定場所は動かし方によって異なります。PHP-FPMでは .htaccess の php_value は使えないため、FPM用の php.ini、プールの設定ファイルの php_admin_value、または .user.ini を使います。変更後はPHP-FPMの再読み込みが必要です。upload_size_limit フィルターでWordPress側の上限を下げることはできますが、PHPの上限を超えて上げることはできません。
413エラーやアップロード失敗の切り分け
アップロードが失敗したとき、どこで止められたかによって表示が変わります。
- ApacheのLimitRequestBodyを超えた: Apacheが413を返し、「Request Entity Too Large」という見出しの標準エラーページが表示されます。ApacheのエラーログにLimitRequestBodyに関する記録が残ることもあります。
- 前段のプロキシやCDNが止めた: Nginxをリバースプロキシにしている場合は
client_max_body_size(既定は1MB)が先に効きます。返ってきたエラーページの見た目や、レスポンスヘッダーのServerを見ると、どのソフトウェアが返したかが分かります。CDNを通している場合は、契約内容によってアップロードできるサイズに上限があるため、CDNのドキュメントを確認します。 - PHPのpost_max_sizeを超えた: 413にはならず、PHPが本文を捨ててしまうため、WordPress側では送信内容が空になったように見えます。PHPのエラーログに
POST Content-Lengthに関する警告が出ます。 - PHPのupload_max_filesizeを超えた: WordPressのメディア画面にファイルサイズに関するエラーメッセージが表示されます。
- ModSecurityなどのWAFが止めた: ModSecurityには本文の大きさを制限する
SecRequestBodyLimitがあり、超えると413や403を返します。ModSecurityの監査ログで確認します。 - mod_fcgidでPHPを動かしている:
FcgidMaxRequestLenの既定値が小さいため(mod_fcgid 2.3.6以降は128KB)、比較的小さな送信でも500エラーになることがあります。エラーログにMaxRequestLenを含む記録があれば、この値を引き上げます。
時間のかかるアップロードでは、サイズではなくタイムアウトで失敗することもあります。Apacheの Timeout やPHPの max_input_time も合わせて確認してください。
確認方法
設定後は、実際に上限前後の大きさのファイルを送って動きを確かめます。
# 70MBのダミーファイルを作り、上限64MBのサイトへ送る
head -c 70M /dev/zero > /tmp/test.bin
curl -s -o /dev/null -w "%{http_code}\n" \
-X POST --data-binary @/tmp/test.bin https://example.com/size-test/
上限を超えていれば413が返ります。本番サイトで試す場合は、上の例のように存在しないパスなど、処理に影響しないURLを宛先にし、終わったらダミーファイルを削除してください。
まとめ
- 本文の大きさは
LimitRequestBody、ヘッダーとURLはLimitRequestFieldSize・LimitRequestFields・LimitRequestLineで制限します。 LimitRequestBodyの既定値は2.4.54以降で1GiBです。それより前は無制限でした。- WordPressのアップロード上限は主にPHPの
upload_max_filesizeとpost_max_sizeで決まり、Apache側だけ変えても表示は変わりません。 - 413が出たら、Apache・前段のプロキシ・CDN・WAFのどこが返したかを先に見分けます。
- ログインページなど大きな本文が不要な場所は、小さい値で制限すると不要なリクエストを早く断れます。