WordPressサイトの移転&ドメイン変更を同時にしたときのリダイレクト

普通はサイトの移転(サーバー会社の変更)とドメインの変更を同時に行うとSEO上かなりよろしくないのでやらない。が、今回はさくらサーバーで不具合ありすぎたので、まとめてやった。

ドメイン直下同士なら Redirection プラグインで一発

もし old-website.com の直下にWPをインストールしていて、new-website.com の直下にWPインストール(移転)するかたちならRedirectionプラグインで一発で行ける。

旧サイト(ドメインとサーバー)の方でRedirectionプラグインを入れて、「転送ルール」タブではなく「サイト」タブの方で、新しいドメインを入れて終了。

下層ページもキレイにリダイレクトしてくれ、かつ管理画面系(wp-login.php, wp-admin など)はリダイレクトせずにログインできるようにしてくれる。

Redirectionプラグインでログインできなくなった場合

もし間違って管理画面に入れなくなったら、FTPソフトでプラグインのフォルダ名を変更して(_redirection とかに)やればプラグインが停止しリダイレクトはされなくなる。

ただしブラウザのキャッシュが残ってるので、設定からCookieとサイトデータを削除しないと反映されない。

ただ結局プラグインの内容を変更しないと本質的な解決につながらない。phpMyAdminなどでRedirection関係のデータベースのうち以下のテーブルの「データ」をすべて削除しよう。テーブルそのものではなく、「データ(行)」を削除することに注意。

  • wpxxxxxredirection_logs

WP本体をサブディレクトリにインストールしている場合

今回がこれだった。例えば以下の構造の場合

  • WordPressアドレス:https://old-website.com/wp
  • サイトアドレス:https://old-website.com

この場合、まず上記でのWordpressサイトの表示を実現するため、それぞれのディレクトリの index.php, .htaccess に手を加えているはず。具体的にはルートの index.php で「/wp/wp-header.phpを参照してね」と書いてある。で、/wp/wp-header.php から同じディレクトリにある .htaccess の BEGIN WordPress のコードを見に行く仕組みになってるはず。詳しくはWP公式の案内を参照(https://wordpress.org/support/article/giving-wordpress-its-own-directory/

で、この形を以下に変えた。

  • WordPressアドレス:https://new-website.com
  • サイトアドレス:https://new-website.com

この場合こういう .htaccess の記述となる

# old-website.com/.htaccess

# BEGIN Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/blog/ # blogディレクトリは除外
RewriteRule ^(.*)$ https://new-website.com/$1 [R=301,L]
</IfModule>
# END Redirect

# BEGIN WordPress # もとからあったもの
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
# old-website.com/wp/.htaccess

# BEGIN Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^(.*)?wp-(.*) # 管理画面を除外
RewriteRule ^(.*)$ https://new-website.com/$1 [R=301,L]
</IfModule>
# END Redirect

# BEGIN WordPress # もとからあったもの
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>

# END WordPress

RewriteCondの仕組みとか、htaccess, wordpressの仕組み、リダイレクトルールの書き方を熟知してないと難しいかもこれは。。