サブディレクトリからメインディレクトリへアドレスを移動する
wordpressサイトのドメインを変更したとき、前のURLにアクセスしてきた人は、見れなくなります。
また、今までのSEO評価などもリセットされてしまいます。
そうならないように、前のURLにアクセスしてきた人を、リダイレクトで新しいドメインのURLに飛ばしてあげる必要があります。
また、SEOなども引き継ぎたいときに、このリダイレクトが必要になります。
今回、サブドメインにあるブログをメインドメインに移動させたのですが、
あまりうまくいかなかったので、最終的にどうしたか方法を書きます。
方法としては、
・ドメイン移行やURL全体の変更などのように、wpフォルダごと新しいドメインに移動させて、htaccessを編集する方法
・もう1つはサブドメインからメインドメインへの移行などで、wpフォルダはそのままにして、アドレスのみ変更する方法があります。
カテゴリのURLやサイトのページの一部などの場合は、プラグインを使ったほうが良いようです。
あらかじめ、アドレスの/wpや/wordpressは消している状態から始めます。
1つ目の方法
・サイトアドレスを変更する
wordpress管理画面にログインして、「設定」の「一般設定」を開いて、サイトアドレスの部分を変更後のアドレスに変更します。
今回、https://aaaa.com/bbb としていたのを、 https://aaaa.com と変更しました。
その上のwordpressアドレスも同様に変更します。
https://aaaa.com/bbb/wp ▶️ https://aaaa.com/wp になります。
・ファイルの移動
サーバー内のwpフォルダやindex.php, .htaccessなどフォルダ外に出しているものなど関連するファイルごと、メインドメイン(移行先)へコピーして移動させる。
・htaccessの編集
.htaccessを編集します。これは元のフォルダにある方を編集して、リダイレクトの設定をします。
# ↓ここから↓---------------------------------
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^aaaa.com/bbb [NC]
RewriteRule ^(.*) https://aaaa.com/$1 [R=301,L]
# ↑ここまで追加↑----------------------------
# BEGIN WordPress よりも前に書きます。
3行目は古いドメイン、4行目に新しいドメインを書きます。
^は上の古いドメインの*全てのアクセスということになります。
$1はスラッグなど記事のリンクでしょうか?
つまり、古いドメイン aaaa.com/bbb へのアクセス全てを新しい方のドメインへ返すということになります。管理画面のアドレスも変わります。
・元のフォルダには、htaccessを残して、リダイレクト設定を書く。
・それ以外のフォルダやファイルなどは、新しいフォルダ内へ移動させる。
以上になりますが、
この方法がうまくいっているのかわからない。
記事ページなど https://aaaa.com/bbb/archive などは https://aaaa.com/archive へ移動するが、
トップページの https://aaaa.com/bbb はhttps://aaaa.combbb となりうまく移行しない。
この場合は、htaccessに追加した記述を
RewriteEngine on
RewriteRule ^(.*) https://aaaa.com/$1 [R=301,L]
のみ、記述するようにしてみてください。
main dir | sub dir | wp | index.php |
.htaccess | |||
このときのURLは、 | https://main.com/sub/wp | となっているはず。 |
これを、/wpや/wordpressをなくす場合、以下を参考にして、設定からサイトアドレスを変更し、index.php,htaccessの中を変更して、ファイルを移動させる。
main dir | sub dir | wp | |
index.php | |||
.htaccess |
こうすることで、/wpや/wordpressがなくなり、https://main.com/sub というサイトアドレスになる。
今回の方法では、
main dir | sub dir | .htaccess | |
wp | |||
index.php / .htaccess |
として、https://main.com になるようにした。
元フォルダの.htaccessにはリダイレクト処理を書いた。
参考:
https://t-tel.net/wordpress/066/
2つ目の方法
・これは、wordpressのURLにある、/wpや/wordpressをなくす方法に近い。
・サイトアドレスの変更
まず、管理画面にログインし、設定の一般から、サイトアドレスのみ変更する。
・ファイルの移動
メインディレクトリにサブディレクトリから、index.phpを移動させる。
サブディレクトリのhtaccessをコピーして、メインディレクトリに移動させる。
最初の状態
main dir | sub dir | wp | |
index.php | wp-contentなど | ||
.htaccess |
移動後
main dir | sub dir | wp | |
index.php | .htaccess (2) | wp-contentなど | |
.htaccess (1) |
・index.php を編集する。
require( dirname( __FILE__ ) . '/sub/wp/wp-blog-header.php' );
これは、wpフォルダ内のwpヘッダーを取得する。これにより、ヘッダー以降が読み込まれる。
・メインフォルダ内のhtaccess(1)を編集する
これは編集しても、設定からパーマリンクの変更を何もせず、保存すれば、htaccessが上書きされる。
特に編集する必要はない。
以下を参考にすると、サブディレクトリの記述があるが、これでも良い。
https://creat4869.hatenablog.com/entry/2019/08/07/232853
今回の場合、以下のようになる。
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /sub/ → / でも良い /sub/wp/ これでも良いか? RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /sub/index.php [L] </IfModule> # END WordPress
こちらも参考に
https://ja.wordpress.org/support/topic/wordpress%E3%82%92%E3%82%B5%E3%83%96%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%80%81%E3%82%B5%E3%82%A4%E3%83%88ur/
htaccessはwordpressによって書き換えられるので、ここの記述はそれほど気にしなくても良いか。
RewriteBaseは、リダイレクト後のURLの基準になるので、index.phpの置いてある、/ の方が正しいか。
実際、自動で書き換わっていた。
・メインフォルダ内のhtaccess(2)を編集する
.htaccess 内の#BEGIN WordPressという記述より上に記述します。
こちらには、リダイレクト処理を書く。
上記の参考URLを元にすると
RewriteEngine On RewriteCond %{http_host} ^main.com/sub RewriteCond %{REQUEST_URI} !^(.*)?wp-login\.php RewriteCond %{REQUEST_URI} !^(.*)?wp-admin RewriteCond %{REQUEST_URI} !\.css$ RewriteCond %{REQUEST_URI} !\.js$ RewriteCond %{REQUEST_URI} !\.jpg$ RewriteCond %{REQUEST_URI} !\.gif$ RewriteCond %{REQUEST_URI} !\.png$ RewriteRule ^(.*) https://main.com/$1 [R=301,L]
となる。!のマークは否定のマークなので、それらのファイルのURLはリダイレクトしない。
つまり、wpフォルダ内を参照する。
しかし、これではうまくいかない。
すでに、wpフォルダよりも、上の階層にしているからである。
もともと、https://main.com/sub へとアクセスされていたものを、 main.com へ飛ばしたいなら、
subディレクトリへ飛んでくるアクセスを全て、mainへ飛ばせば良い。
RewriteEngine On
RewriteRule ^(.*) https://main.com/$1 [R=301,L]
この2行だけで良い。たぶん。
RewriteCond %{http_host} ^main.com/sub に関しては、サーバーのホスト名を取得、+古いドメイン
とすると、https://(www.)main.com/sub ならば実行するということだと思う。
それなら必要ないと思われる。
このURLの書き方が間違っているのかわからないが、これを記述すると、main.com/sub のURLからリダイレクトされない。
これがなければ、全て、main.comへ飛ぶので、
よしとする。
https://www.adam.ne.jp/support/tips/url-normalization/
https://uxmilk.jp/14769