サイトを移転すると必ず行うのが301リダイレクトです。通常、ドメインの変更だけのことが多いのでトラブルことは少ないです。
先日、サブディレクトリ運用のWordpressサイトを別ドメインのサブディレクトリへ移転した時に移転元から移転先にリダイレクトする必要がありました。
この時、意図通りのリダイレクトになるまで結構時間を取られたのでまとめておきたいと思います。
サブディレクトリ⇒別ドメインのサブディレクトリへのリダイレクト
以下の様な移転を行ったとします。
移転後は、ドメインも変更、サブディレクトリ名も変更というケースです。
移転元:https://old-domain.com/old-subdir
移転先:https://new-domain.com/new-subdir
.htaccessをサブディレクトリの直下に置く場合
設置先:https://old-domain.com/old-subdir/.htaccess
移転元のサブディレクトリの直下に以下の内容の.htaccessを置きます。
RewriteEngine On
RewriteRule ^(.*) https://new-domain.com/new-subdir/$1 [R=301,L]
これで、意図通りにリダイレクトされます。
- 移転元のサブディレクトリの直下に.htaccessを置く
- RewriteRuleに移転元のサブディレクトリ名は不要
- 移転元の内容を移転先で$1で渡す
.htaccessをサブディレクトリより上に置く場合
設置先:https://old-domain.com/.htaccess
後述するRewriteRuleの場合は動かなかったが、Redirect permanentを使う場合は、サブディレクトリに.htaccessがあっても、上位の.htaccessを設置すれば動くようだ。
RewriteEngine On
Redirect permanent /old-subdir/ https://new-domain.com/new-subdir/
ダメな例
サブディレクトリに.htaccessを置く場合
設置先:https://old-domain.com/old-subdir/.htaccess
ケース1
RewriteRuleで引っ掛けて、リダイレクト
RewriteEngine On
RewriteRule ^old-subdir/(.*) https://new-domain.com/new-subdir/$1 [R=301,L]
old-subdirがRewriteRuleに来ないので、マッチしない。old-subdir以下しか見えない。
ケース2
サブディレクトリから無条件にリダイレクトさせる
RewriteEngine On
Redirect permanent / https://new-domain.com/new-subdir/
なぜか、サブディレクトリがそのままリダイレクト先に引き継がれる。
リダイレクト後:https://new-domain.com/new-subdir/old-subdir
サブディレクトリより上に.htaccessを置く場合
設置先:https://old-domain.com/.htaccess
なぜか以下の記述は動かなかった。
恐らく、サブディレクトリ以下に.htaccessがある場合は、そちらが有効になってしまうのではないかと思われる。Wordpressをサブディレクトリ運用している場合は、該当する。
RewriteEngine On
RewriteRule ^old-subdir/(.*) https://new-domain.com/new-subdir/$1 [R=301,L]
- サブディレクトリより上に.htaccessを置く場合は、サブディレクトリに.htaccessがあるとそちらが優先されるので読み込まれない。
まとめ
リダイレクトはデバッグするのが結構面倒なので、もし同じようなケースでハマっている人は参考にしてみてください。
サブディレクトリのリダイレクトは、移転元のサブディレクトリに.htaccessを置く方が安全、かつ、シンプルになる。