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・パーミッション・サブディレクトリ構成を疑う
関連記事: