サイトのドメイン変更を行う時に、変更前⇒変更後に301リダイレクトするのは常識的に行われています。
通常、ドメイン変更の301リダイレクトはとても簡単な1行の記述で対応できます。
しかし、間違えようがないような簡単な記述でも、リダイレクトループが発生するケースがあります。
この記事では、ドメイン変更のリダイレクトでリダイレクトループが発生する場合の対処方法とその原因についてまとめています。
単純なドメイン変更のリダイレクトの記述
単純なドメイン変更を行ったときの.htaccessのリダイレクトの記述はとても簡単です。
実質1行だけで済みますので、間違えるところはなさそうです。
RewriteEngine On
Redirect permanent / https://www.new.com/
この書き方は移転元の公開ディレクトリがルートの場合にはリダイレクトループが発生してしまいます。
なぜ、リダイレクトループが発生するのか?
なぜ、リダイレクトループが発生するのか順を追って説明します。
まず、旧ドメインのサイトが公開ディレクトリのルートに設置されている場合、.htaccessもルートディレクトリに存在することになります。
その.htacessにリダイレクトの記述をして、旧ドメイン⇒新ドメインへリダイレクトさせます。
旧ドメインにアクセスがあると新ドメインにリダイレクトされます。
しかし、新ドメインにアクセスする時に、再度、ルートディレクトリの.htacessが読み込まれます。
理由は簡単で、新ドメインはサブディレクトリに設置されますが、サブディレクトリから見ると、ルートディレクトリはサブディレクトリの親ディレクトリになります。サブディレクトリにある新サイトにアクセスする時には、親ディレクトリの.htaccessが先に読み込まれるためです。
その時点で、再度、新ドメイン⇒新ドメインへのリダイレクトが発生します。リダイレクトが終わらなくなるので、リダイレクトループが発生します。
リダイレクトループが発生しないリダイレクト方法
リダイレクトループが発生するのは、ルートディレクトリにアクセスした時にドメイン名を見ていないので、旧ドメインと新ドメインの区別がつかなくなるためです。
リダイレクトする条件にドメイン名を含めれば、リダリレクトループは発生しなくなります。
RewriteEngine On
RewriteCond %{http_host} ^old.com
RewriteRule ^(.*) https://new.com/$1 [R=301,L]
まとめ
ドメイン変更のリダイレクトは、書き方が簡単なため、リダイレクトループとは無縁だと思っていましたが、旧ドメインの公開ディレクトリがルートディレクトリになっているケースではリダイレクトループが発生するというお話でした。
それを避けるためには、RewriteCondでリダイレクト時にドメイン名を見てやればよい、というのが対策でした。