2026年5月26日
2026年5月26日
Apacheでアップロードファイルの保存場所を設定する 権限・PHP実行禁止・WordPressのUPLOADS
「Apache でアップロードファイルの保存場所を設定したい」というとき、最初に知っておきたいのは、Apache 自体は受け取ったファイルを保存しないということです。Apache はリクエストを PHP などのアプリに渡し、ファイルをどこに置くかはアプリが決めます。Apache の側で行うのは、保存先ディレクトリへの書き込みを許す権限の用意と、そのディレクトリを安全に公開する設定です。
この記事では、WordPress を例に、保存先の決め方・権限・Apache の設定・サイズ上限を順に説明します(2026年11月時点の Apache 2.4 と WordPress の公式情報に基づきます)。
アップロードの流れ
- ブラウザーがファイルを送る
- Apache が受け取り、PHP に渡す(
LimitRequestBodyを超える大きさはここで断られる) - PHP が一時ディレクトリ(
php.iniのupload_tmp_dir、未設定ならシステムの一時ディレクトリ)に保存する - アプリ(WordPress など)が
move_uploaded_file()で本来の保存先へ移す
つまり「保存場所」はアプリの設定で決まり、「書き込めるか」は OS の権限、「どう公開するか」は Apache の設定で決まります。
WordPress の保存先を確かめる・変える
WordPress の既定の保存先は wp-content/uploads です。管理画面の「設定」→「メディア」で「アップロードしたファイルを年月ベースのフォルダーに整理」にチェックがあると、wp-content/uploads/2026/11/ のような年月のフォルダーに分けて保存されます。
保存先そのものを変えたいときは、wp-config.php に UPLOADS 定数を書きます。値は WordPress の設置ディレクトリ(ABSPATH)からの相対パスで書きます(/ から始まるパスは指定できません)。先頭のスラッシュは付けません。
<?php
// wp-config.php の「編集が必要なのはここまでです」の行より上に書く
define( 'UPLOADS', 'wp-content/media' );
この設定で変わるのは、これから先のアップロードの保存先です。既にアップロード済みのファイルは移動されず、投稿本文に書かれた画像の URL も古いままです。既存のファイルも移すときは、ファイルを新しい場所へコピーし、本文中の URL を置き換える作業が別に必要になります(作業前にデータベースのバックアップを取ります)。
保存先ディレクトリの所有者と権限
保存先には、Apache(とその下で動く PHP)を実行しているユーザーが書き込める必要があります。実行ユーザーはディストリビューションで異なります。
| 環境 | Apache の実行ユーザー | 設定の場所 |
|---|---|---|
| Debian / Ubuntu | www-data |
/etc/apache2/envvars |
| RHEL / AlmaLinux / Rocky Linux | apache |
/etc/httpd/conf/httpd.conf の User / Group |
PHP-FPM を使っている場合は、PHP を動かすユーザーは FPM のプール設定(user / group)で決まります。そのユーザーに書き込み権限を与えます。
Debian / Ubuntu で WordPress を /var/www/html に置いている場合の例です。
sudo mkdir -p /var/www/html/wp-content/uploads
sudo chown -R www-data:www-data /var/www/html/wp-content/uploads
sudo find /var/www/html/wp-content/uploads -type d -exec chmod 755 {} \;
sudo find /var/www/html/wp-content/uploads -type f -exec chmod 644 {} \;
WordPress の推奨はディレクトリ 755、ファイル 644 です。書き込めないからといって 777 にすると、同じサーバーの他のユーザーやプロセスからも書き換えられる状態になるので避けます。
SELinux が有効な環境(RHEL 系)
RHEL・AlmaLinux・Rocky Linux では SELinux が有効なことが多く、権限が正しくても Apache から書き込めない場合があります。保存先に書き込み用のラベルを付けます。
sudo dnf install -y policycoreutils-python-utils
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/wp-content/uploads(/.*)?"
sudo restorecon -Rv /var/www/html/wp-content/uploads
ls -Z /var/www/html/wp-content/uploads
ls -Z の表示に httpd_sys_rw_content_t が出ていれば設定されています。chcon による変更は restorecon で元に戻ってしまうため、semanage fcontext で登録する方法を使います。
アップロード先で PHP を実行させない
アップロード先は外部から書き込まれる場所なので、万一 PHP ファイルが置かれても実行されないようにしておくと被害を抑えられます。Apache 2.4 の設定(Debian 系なら /etc/apache2/sites-available/ のサイト設定、RHEL 系なら /etc/httpd/conf.d/ の設定ファイル)に次を加えます。
<Directory "/var/www/html/wp-content/uploads">
Options -Indexes
<FilesMatch "\.(?i:php|phar|phtml)$">
Require all denied
</FilesMatch>
</Directory>
Options -Indexesは、index.htmlの無いディレクトリでファイル一覧を表示させない設定ですFilesMatchの部分で、拡張子が.php・.phar・.phtmlのファイルへのアクセスを拒否します(大文字小文字を区別しません)
サーバーの設定ファイルを編集できないレンタルサーバーでは、AllowOverride で許可されていれば、同じ FilesMatch の部分を wp-content/uploads/.htaccess に書く方法もあります。
設定後、構文を確認して再読み込みします。
sudo apachectl configtest
sudo systemctl reload apache2
RHEL 系では sudo systemctl reload httpd です。確認のため、試験用のファイルを置いてアクセスし、403 が返ることを確かめたら削除します。
echo test | sudo tee /var/www/html/wp-content/uploads/test.php
curl -I http://localhost/wp-content/uploads/test.php
sudo rm /var/www/html/wp-content/uploads/test.php
アップロードできる大きさの上限
大きなファイルがアップロードできないときは、次の設定を順に確かめます。小さい値のものが上限になります。
| 設定 | 場所 | 既定値 |
|---|---|---|
LimitRequestBody |
Apache の設定 | 1073741824(1GiB)。Apache 2.4.53 以前は 0(無制限) |
upload_max_filesize |
php.ini |
2M |
post_max_size |
php.ini |
8M |
max_file_uploads |
php.ini |
20(1回のリクエストで送れるファイル数) |
post_max_size はリクエスト全体の上限なので、upload_max_filesize 以上にします。PHP の設定を変えたら、mod_php なら Apache を、PHP-FPM なら FPM のサービスを再起動して反映します。WordPress の場合、反映後の上限はメディアの追加画面に表示される最大アップロードサイズで確かめられます。
うまくいかないときの確認
- エラーログを見る(Debian 系
/var/log/apache2/error.log、RHEL 系/var/log/httpd/error_log)。Permission deniedなら所有者・権限・SELinux を確認する - WordPress でアップロードしたファイルを保存先に移動できないという趣旨のエラーが出るときは、保存先の所有者と権限を確認する
- エラーログに詳しい情報が出ないときは、一時的に
LogLevelを上げる(ApacheのLogLevel設定方法)
WordPress で画像のアップロードが失敗するときの原因の切り分けは WordPressで画像がアップロードできないときの対処 で扱っています。
まとめ
- 保存先を決めるのはアプリで、Apache は受け渡しと公開を担当する
- WordPress の保存先は
wp-config.phpのUPLOADS(ABSPATHからの相対パス)で変えられる - 保存先は Apache・PHP の実行ユーザーが書き込めるようにし、
777は避ける。RHEL 系では SELinux のラベルも付ける - アップロード先では PHP を実行させず、ファイル一覧も表示させない
- サイズの上限は
LimitRequestBody・upload_max_filesize・post_max_sizeのうち最も小さい値で決まる