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%'"で置換漏れがないか検証します。

お気軽にご相談ください

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