2026年7月19日

2026年7月19日

Apache環境でWordPressパーマリンク404修正

はじめに

WordPressでパーマリンクを「投稿名」など「Plain」以外に変更したとたん、トップページは表示されるのに個別投稿だけが404になる、というのは典型的なApache環境のトラブルです。原因のほぼ全ては mod_rewrite が無効、または .htaccess が読み込まれない設定になっていることに起因します。

本記事では、Apache 2.4 + WordPress 環境を前提に、404エラーの原因を切り分けて修正する手順を紹介します。a2enmod rewrite からVirtualHost内の AllowOverride 設定、.htaccess の再生成、SELinux環境での注意点までを順に押さえます。

サブディレクトリ・サブドメインインストールにも触れているため、複数サイト構成のWordPressにも応用できます。

症状・背景

  • トップ / は表示されるが /sample-post/ で404が出る
  • 管理画面の「パーマリンク設定」を保存しても改善しない
  • .htaccess/var/www/html 直下に無い・書き換え不可
  • カスタム投稿タイプのURLだけが404になる

手順・設定方法

ステップ1: mod_rewriteの有効化を確認

まずApacheでrewriteモジュールが有効か確認します。

# Debian/Ubuntu系: モジュール有効化
sudo a2enmod rewrite

# 有効化されたモジュール一覧
apache2ctl -M | grep rewrite

# RHEL系: /etc/httpd/conf.modules.d/00-base.conf に下記行があるか
grep rewrite /etc/httpd/conf.modules.d/00-base.conf

# 設定反映
sudo systemctl restart apache2  # Debian系
# sudo systemctl restart httpd  # RHEL系

ステップ2: AllowOverrideを許可する

.htaccess が読み込まれるようVirtualHost設定を調整します。

# VirtualHost設定を開く
sudo nano /etc/apache2/sites-available/wordpress.conf

# Directoryブロックを次のように設定
# <Directory /var/www/html>
#     AllowOverride All
#     Require all granted
# </Directory>

# 構文チェック
sudo apache2ctl configtest

# 反映
sudo systemctl reload apache2

ステップ3: .htaccessの再生成

WordPress標準のリライトルールを書き込みます。

# .htaccessが存在しない場合は作成
sudo touch /var/www/html/.htaccess
sudo chown www-data:www-data /var/www/html/.htaccess
sudo chmod 644 /var/www/html/.htaccess

# WordPress標準のリライトルールを書き込む
sudo tee /var/www/html/.htaccess > /dev/null <<'EOF'
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
EOF

ステップ4: 管理画面でパーマリンクを再保存

最終仕上げとして再保存しキャッシュをクリアします。

# wp-cliが入っているならコマンドで再生成
sudo -u www-data wp rewrite flush --hard --path=/var/www/html

# パーマリンク構造を投稿名に設定
sudo -u www-data wp rewrite structure '/%postname%/' --path=/var/www/html

# パーマリンク状況の確認
sudo -u www-data wp rewrite list --path=/var/www/html

# ブラウザキャッシュをバイパスして確認
curl -I https://example.com/sample-post/

注意事項

  • AllowOverride None のままだと .htaccess は一切読まれないため、a2enmod rewrite だけでは不十分です
  • 共有レンタルサーバーで .htaccess が利用できない場合は、サーバー側の管理画面でmod_rewrite相当の機能を有効化する必要があります
  • SELinuxが有効な環境では .htaccess のラベルを httpd_sys_rw_content_t に設定しないと書き換えが拒否されます
  • パーマリンク変更時はリダイレクト対策(旧URLからのRedirect 301)も合わせて検討します

まとめ

1. mod_rewrite有効化: a2enmod rewrite + Apache再起動が大前提

2. AllowOverride All: VirtualHostのDirectoryブロックで明示的に許可

3. .htaccess再生成: WordPress標準ルールを書き込み、所有者を www-data に

4. wp-cliで強制flush: 管理画面が開けないときは wp rewrite flush --hard

5. 404が残る場合: SELinux・パーミッション・サブディレクトリ構成を疑う

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ