くりすたる・の〜と

とりあえずメモとかしてみた。

【失敗】301redirectが無限ループしちゃった話。

2016.04.03

さくらのレンタルサーバに『マルチドメイン』を設定して、お気楽に『redirect』させたら無限ループしてしまって、大変だった!...ってなお話なのです。下位ディレクトリへの『redirect』は要注意!なのです。

redirectさせたら無限ループしたっ!!

無限ループは恐ろしいバグの一つなのです。


●Redirectが無限ループした時のログ。こんなのを放っておいたら大変なことになるのです。

301 Redirectはページを移動しても自動で新しいページへアクセスさせることができる、すごく便利な方法なのです。ですが、使い方を誤るとこういうひどいことになるのです。

基本的に、下位ディレクトリにredirectするとループする...のは知ってました。

redirectさせるには、.htaccessというファイルにこんな感じのテキストを書くのです。

redirect permanent /d/ http://crs-10.com/d/

前は絶対パス。後ろに新しいアドレスなのです。必ずしもファイル名まで指定する必要もなく、例のコードの様にディレクトリ(フォルダ)のパスを書いておけば、対象のディレクトリ単位で移動させることも可能なのです。(この場合、元のドメイン『c-n.sakura.ne.jp』から新しいドメイン『crs-10.com』に移動させることができる。)

この設定は下位ディレクトリまで継承されるので、一番上位のみに書いておけばいいというのも楽だったりするのです。

また、同じドメイン内でも可能なので、例えば、

redirect permanent /d/ http://crs-10.com/memo/

と書けば、『d』ディレクトリから『memo』ディレクトリへ移動させることできます。ただし、この設定は下位ディレクトリまで継承される為、

redirect permanent /d/ http://crs-10.com/d/memo/

みたいに、下位ディレクトリへの移動はできないのです。

こう書いてしまうと、『/d/memo/』に移動した時に、やはり、『/d/』に条件が合致してしまうので、もう一度redirectされてしまうのです(涙)。結果、永遠とredirectされ続けてしまうのです。便利な機能が仇になってしまったのです...。(たいていのブラウザは賢いので、途中で止めてくれますが、焦るのです。)

これは、ルート『/』からサブディレクトリに移動させようとする時なんかに、はまる罠なのです。

サブディレクトリにドメインを設定してrediretさせて失敗したのです。

で、今回の失敗例なのです。まず、以下のようにサーバーを設定したのです。

で、無限ループしました。なんでだよ(!)

で、少し悩んで気づいたのです。

これ、たぶん、きっと、ディレクトリにドメインを指定した場合、.htaccessやアクセスの『解釈』はドメインのあるフォルダを基準にして行われるけど、継承はサーバーの物理的なディレクトリそのままに行われるってことですよね?(【crs-10.com】にアクセスしても、ルート【c-n.sakura.ne.jp】に指定したエラーページが表示されたしぃ。)

とすると、さっきと同じパターンなんですよね。【crs-10.com】([www/abc]ディレクトリ)にアクセスされても、上位にある【c-n.sakura.ne.jp】([www]ディレクトリ)にある設定が継承されてしまうから、結果、【crs-10.com】では、同じページにredirect設定されているという、大変おマヌケな状態になっていた、ということ、らしいのです^^;。違うサーバーへのリダイレクトなら、こういう問題は起こらなかったんでしょうねぇ。

【余談】結局、この問題は【c-n.sakura.ne.jp】側で、ディレクトリ毎に.htaccessを設置し、ディレクトリ単位でリダイレクトさせることで解決したのでした。(【/memo/】から、【/abc/memo/】へのリダイレクトなら、【/memo/】に.htaceessファイルを置けば設定は継承されないので問題ないのです。最上位のディレクトリにはページを置いていなかったのが幸いだったのです。)



くりすたる・の〜と