WordPressの画像がInternal Server Errorで表示されない原因がuploadsの.htaccessだった

WordPressに画像をアップロードしたあと、記事本文ではもちろん、管理画面のメディアライブラリでもサムネイルが表示されないことがありました。

画像URLを直接開くと Internal Server Error になります。

https://techblog.sasashima.works/wp-content/uploads/2026/05/chrome-devtools-full-size-screenshot-ja.png

最初は画像ファイルのアップロード失敗や、ファイル名の問題を疑いましたが、原因は wp-content/uploads/.htaccess でした。

環境

  • Google Compute Engine
  • Apache
  • WordPress
  • Really Simple Security プラグイン

症状

WordPressのメディアライブラリに画像をアップロードすると、ファイル自体は作成されていました。

$ sudo ls -l /var/www/html/wp-content/uploads/2026/05/ | grep chrome-devtools
-rw-r--r-- 1 www-data www-data 272094 May 24 15:24 chrome-devtools-full-size-screenshot-ja-1024x754.png
-rw-r--r-- 1 www-data www-data  18100 May 24 15:24 chrome-devtools-full-size-screenshot-ja-150x150.png
-rw-r--r-- 1 www-data www-data  43987 May 24 15:24 chrome-devtools-full-size-screenshot-ja-300x221.png
-rw-r--r-- 1 www-data www-data 179307 May 24 15:24 chrome-devtools-full-size-screenshot-ja-768x566.png
-rw-r--r-- 1 www-data www-data 183173 May 24 15:24 chrome-devtools-full-size-screenshot-ja.png

元画像もサムネイルも生成されています。所有者も www-data、パーミッションも 644 なので、一見すると問題なさそうです。

それでも画像URLを開くと 500 Internal Server Error になりました。

エラーログを見る

Apacheのエラーログを確認します。

$ sudo tail -n 100 /var/log/apache2/error.log

すると、以下のログが出ていました。

/var/www/html/wp-content/uploads/.htaccess: Require not allowed in <Files> context

これで、画像ファイルそのものではなく、uploads 配下の .htaccess が原因だと分かりました。

原因

/var/www/html/wp-content/uploads/.htaccess の内容は以下でした。

#Begin Really Simple Security
<Files *.php>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
</Files>
#End Really Simple Security

Really Simple Securityの「共用の uploads フォルダー内でのコード実行を防止」という設定によって生成されたものです。

uploads配下でPHPを実行できないようにする意図自体は分かります。ただ、この環境では .htaccess 内の Require all denied<Files> コンテキストで使えず、Apacheがエラーにしていました。

その結果、画像ファイルへのアクセスまで 500 Internal Server Error になっていました。

対処

Really Simple Securityの設定画面で、「共用の uploads フォルダー内でのコード実行を防止」をオフにしました。

そのうえで、生成されていた .htaccess を退避します。

$ sudo mv /var/www/html/wp-content/uploads/.htaccess /var/www/html/wp-content/uploads/.htaccess.bak
$ sudo systemctl reload apache2

退避できていることを確認します。

$ sudo ls -la /var/www/html/wp-content/uploads/.htaccess
ls: cannot access '/var/www/html/wp-content/uploads/.htaccess': No such file or directory

この状態で画像URLを開くと、元画像もサムネイルも表示されるようになりました。

注意点

今回オフにした設定は、uploads配下でPHPを実行させないためのものです。そのため、単にオフにして終わりにするより、必要であればApache側の設定で同等の制限を入れるのがよさそうです。

ただし、.htaccess にプラグインが生成する形のままだと、この環境ではまた同じエラーになります。

まずは画像配信を復旧し、その後でWebサーバー側の設定としてPHP実行禁止を入れるのが安全そうです。

まとめ

WordPressでアップロードした画像が 500 Internal Server Error になる場合、画像ファイルやパーミッションだけでなく、wp-content/uploads/.htaccess も確認するとよさそうです。

今回の原因は Really Simple Security が生成した .htaccess でした。

エラーログに以下が出ていたら、同じ原因の可能性があります。

Require not allowed in <Files> context

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)