2026年8月22日
2026年8月22日
WordPressの移行後に404エラーが出る問題を解決する方法
はじめに
サイト移行やドメイン変更後に全ページが404エラーになるのはWordPressの典型的な問題です。パーマリンクの再設定とデータベース内のURL置換を行うことで、ほとんどのケースで解決できます。
症状・原因
- 移行後にトップページ以外が全て404になる
- ドメイン変更後に画像や内部リンクが旧ドメインを参照している
- サーバー移転後にパーマリンクが機能しない
.htaccessのmod_rewrite設定が新サーバーに引き継がれていない
解決手順
ステップ1:データベース内のURLを新ドメインに置換する
# ① 旧ドメインの残骸を確認(dry-run)
wp search-replace 'https://old-domain.com' 'https://new-domain.com' \
--dry-run --all-tables --skip-columns=guid
# ② 本番置換
wp search-replace 'https://old-domain.com' 'https://new-domain.com' \
--all-tables --skip-columns=guid
# http/https 両方を置換
wp search-replace 'http://old-domain.com' 'https://new-domain.com' \
--all-tables --skip-columns=guid
# ③ siteurl / home を明示的に更新
wp option update siteurl 'https://new-domain.com'
wp option update home 'https://new-domain.com'
ステップ2:パーマリンクを再設定する
# パーマリンクをフラッシュして .htaccess を再生成
wp rewrite flush --hard
# パーマリンク構造を確認
wp option get permalink_structure
# パーマリンク構造が空の場合は設定
wp option update permalink_structure '/%postname%/'
wp rewrite flush --hard
管理画面からパーマリンクをリセットする手順:
1. WordPress管理画面にログイン
2. 設定 → パーマリンク設定
3. 現在の設定を変更せず「変更を保存」をクリック
(これだけで .htaccess が再生成される)
ステップ3:.htaccess を確認・修正する
# .htaccess の標準設定(これがないと404になる)
# 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
# .htaccess が存在するか確認
ls -la /var/www/html/.htaccess
# .htaccess のパーミッションを確認(644が適切)
stat /var/www/html/.htaccess
# WP-CLI で .htaccess を再生成
wp rewrite flush --hard
# mod_rewrite が有効か確認(Apache)
apache2ctl -M | grep rewrite
# mod_rewrite を有効化(Ubuntu/Debian)
a2enmod rewrite
systemctl reload apache2
ステップ4:サブディレクトリへの移行時の追加設定
# サブディレクトリ(/blog/ など)にインストールされている場合
# .htaccess の RewriteBase を変更する
# ❌ ルートインストールの設定
RewriteBase /
# ✅ /blog/ サブディレクトリの場合
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
# サブディレクトリの場合は blog_public も確認
wp option get blog_public
# wp-config.php でサイトURLを上書き設定
# define('WP_HOME', 'https://new-domain.com/blog');
# define('WP_SITEURL', 'https://new-domain.com/blog');
ステップ5:移行後の動作確認チェックリスト
# 1. siteurl / home が正しいか
wp option get siteurl && wp option get home
# 2. パーマリンク設定が正しいか
wp option get permalink_structure
# 3. .htaccess が存在し適切な内容か
cat /var/www/html/.htaccess
# 4. データベース内に旧ドメインが残っていないか
wp db query "SELECT COUNT(*) FROM wp_posts
WHERE post_content LIKE '%old-domain.com%';"
wp db query "SELECT COUNT(*) FROM wp_options
WHERE option_value LIKE '%old-domain.com%';"
# 5. キャッシュをクリア
wp cache flush
wp transient delete --all
注意事項
wp search-replaceでシリアライズされたデータを置換する際、--preciseオプションを付けると精度が上がりますが処理が遅くなります。大量のデータがある場合は省略してデフォルト動作で実行してください--skip-columns=guidを指定することでメディアのguid列を保持できます。guidを変えると添付ファイルへの参照が壊れる場合があるため、基本的に省略しないでください- Nginxを使っている場合は
.htaccessではなくNginxの設定ファイル(try_files $uri $uri/ /index.php?$args;)を確認してください
まとめ
移行後404解消は①wp search-replace 'https://old-domain.com' 'https://new-domain.com' --all-tables --skip-columns=guidでDB内URL一括置換、②wp option update siteurl/homeで新ドメインを明示設定、③wp rewrite flush --hardでパーマリンクと.htaccessを再生成、④.htaccessにmod_rewriteの標準設定(RewriteBase /)があるか確認、⑤wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_content LIKE '%old-domain%'"で置換漏れがないか検証します。