【redirect 301】.htaccessで親ドメインからサブドメインに転送したらリダイレクトループしてしまう意外な理由

サイト(ドメイン)移転で欠かせない作業としてリダイレクト処理があります。

リダイレクト処理をすることで、旧サイト・旧ドメインから新サイト・新ドメインに既存ユーザーを引き継ぐわけです。

しかし、ここで問題になる可能性があるのがリダイレクトループというエラーです。

リダイレクトループ自体は割とよくある話ではあるのですが、今回は少し珍しいケースだったので紹介したいと思います。

問題

今回起きたトラブルでは.htaccessファイルに以下の記述をしたことで起きました。

redirect 301 /test/ https://sub.sample.com/test/

こんな感じの.htaccessファイルを作り、親ドメインサイトにアップします。

これは、 /test/ というページにアクセスしたら、サブドメインの同じ名前のページにリダイレクトするという処理です。

普通ならこれで問題なく動作するはずなんですが、どういうわけだかリダイレクトループしてしまいました。

原因

私自身、あまりサーバーの設定には詳しくないので、原因特定に少し時間がかかりましたが無事原因を見つけることができました。

親ドメインサイトにアップした.htaccessファイルがサブドメインサイトにも適用されたことが原因で、リダイレクトループしてしまったのです。

ここで、サーバー設定にあまり詳しくない人は、「なぜ、親ドメインサイトの.htaccessがサブドメインサイトにも影響するの?」と疑問に思うはずです。

実は、ディレクトリ構造によってはこういった事態が起こります。

親ドメインサイトの公開ディレクトリの中にサブドメインサイトの公開ディレクトリがある構成図

.htaccessは設置したディレクトリ以下の全てのサブディレクトリに影響するという性質があります。

なので、このように親ドメインサイト公開ディレクトリとサブドメインサイト公開ディレクトリが親子関係になっていると、親ドメインサイトにアップした.htaccessの設定がサブドメインサイトにも影響してしまうわけです。

先ほど紹介した.htaccessの記述の例で言うと、サブドメインページからサブドメインページにリダイレクトすることになるので、リダイレクトループが発生してしまうということですね。

解決法

解決方法は2つほどあります。

1つはシンプルな解決方法で、サブドメインサイト公開ディレクトリを親ドメインサイト公開ディレクトリ配下に設置しないということです。

ただ、もしかするとレンタルサーバーの仕様次第ではユーザーが自由に設定できない場合があるかもしれません。

もう1つは、.htaccessにIfディレクティブを使って条件分岐をする方法です(Ifディレクティブは Apache 2.4 以降で使えます)。

<If "%{HTTP_HOST} == 'sample.com'">
redirect 301 /test/ https://sub.sample.com/test/
</If>

このように記述するとアクセスされたホスト名が『sample.com』の場合だけ、リダイレクト処理が実行されるようになるわけです。

これで、サブドメインサイト公開ディレクトリには影響が及ばなくなります。

ただし、この書き方だと「www.sample.com」でアクセスされた場合はリダイレクトされません。www付きでもアクセスされるサイトでは、条件を『%{HTTP_HOST} != ‘sub.sample.com’』(サブドメイン以外の場合)にしておくと安心です。

Ifディレクティブが使えない環境(Apache 2.2 など)では、mod_rewrite を使って次のように書くこともできます。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?sample\.com$ [NC]
RewriteRule ^test/(.*)$ https://sub.sample.com/test/$1 [R=301,L]

また、301リダイレクトはブラウザにキャッシュされるため、.htaccessを修正してもリダイレクトループが続いているように見えることがあります。動作確認は302(一時的なリダイレクト)で行い、問題がないことを確かめてから301に切り替えると安全です。確認するときは、ブラウザのキャッシュを削除するか、シークレットウィンドウを使ってください。

同じような症状に悩んでいる人がいたら参考にしてみてください。

また、一般的なリダイレクトループの原因は下記サイトで解説されているので、ぜひ参考にしてみてください。
https://pecopla.net/seo-column/htaccess-redirect-errors-approach

タイトルとURLをコピーしました