サイト(ドメイン)移転で欠かせない作業としてリダイレクト処理があります。
リダイレクト処理をすることで、旧サイト・旧ドメインから新サイト・新ドメインに既存ユーザーを引き継ぐわけです。
しかし、ここで問題になる可能性があるのがリダイレクトループというエラーです。
リダイレクトループ自体は割とよくある話ではあるのですが、今回のケースは割とレアなケースだったので紹介したいと思います。
問題
今回起きたトラブルでは.htaccessファイルに以下の記述をしたことで起きました。
redirect 301 /test/ https://sub.sample.com/test/
こんな感じの.htaccessファイルを作り、親ドメインサイトにアップします。
これは、 /test/ というページにアクセスしたら、サブドメインの同じ名前のページにリダイレクトするという処理です。
普通ならこれで問題無く動作するはずなんですが、どういうわけだかリダイレクトループしてしまいました。
原因
私自身、あまりサーバーの設定には詳しくないので、原因特定に少し時間がかかりましたが無事原因を見つける事が出来ました。
原因は親ドメインサイトにアップした.htaccessファイルがサブドメインサイトにも適用されたことが原因で、リダイレクトループしてしまったという事です。
ここで、サーバー設定にあまり詳しくない人は、「なぜ、親ドメインサイトの.htaccessがサブドメインサイトにも影響するの?」と疑問に思うはずです。
実は、ディレクトリ構造によってはこういった事態が起こります。
.htaccessは設置したディレクトリ以下の全てのサブディレクトリ影響するという性質があります。
なので、このように親ドメインサイト公開ディレクトリとサブドメインサイト公開ディレクトリが親子関係になっていると、親ドメインサイトにアップした.htaccessの設定がサブドメインサイトにも影響してしまうわけです。
先ほど紹介した.htaccessの記述の例で言うと、サブドメインページからサブドメインページにリダイレクトすることになるので、リダイレクトループが発生してしまうという事ですね。
解決法
解決方法は2つほどあります。
1つはシンプルな解決方法で、サブドメインサイト公開ディレクトリを親ドメインサイト公開ディレクトリ配下に設置しないという事です。
ただ、もしかするとレンタルサーバーの仕様次第ではユーザーが自由に設定場合があるかも知れません。
もう1つは、.htaccessにIFディレクティブを使い条件分岐をする方法です。
<If "%{HTTP_HOST} == 'sample.com'"> redirect 301 /test/ https://sub.sample.com/test/ </If>
このように記述すると現在のURLが『sample.com』の場合だけ、リダイレクト処理が実行されるようになるわけです。
これで、サブドメインサイト公開ディレクトリには影響が及ばなくなります。
同じような症状に悩んでいる人がいたら参考にしてみてください。
また、一般的なリダイレクトループ原因は下記サイトで解説されてるので是非参考にしてみてください。
https://pecopla.net/seo-column/htaccess-redirect-errors-approach
コメント