【無限ループの恐怖】 リダイレクトできない!を解決した
さくらのレンタルサーバは、Apacheの吐き出したエラーをエラーコードのページで見れるのだが、そのエラーコードのページに、とあるURLがちょくちょくエラーが吐き出されているのを見つけた。
そのURLばかり何でエラーが出てしまうのか確認した所、存在しないページへのURLにとあるページからリンクが貼られているためだった。
本当は、存在しないURLにリンクを貼ることはしたくなかったのだが、ポツポツやってくる人がいるようなので、htaccessファイルでリダイレクト処理をして、ちゃんとしたURLに自動転送することにした。
とまあ、ここまでは良いのだが、問題はここからだった。
理由は定かではないのだが、リダイレクトに失敗してしまうのだ。
リダイレクトエラー(403エラー)の状態
私がやったリダイレクト処理はこのようなものだった。
(htaccessに以下のようなコードを記入して、Apache(サーバーにインストールされているソフト)の機能で自動転送する)
Redirect permanent /aaaaaaa https://example.com/aaaaaaa/bbbbbbb.html
これは、https://example.com/aaaaaaa/ と言うURLを https://example.com/aaaaaaa/bbbbbbb.html に自動転送(301リダイレクト)すると言うものだ。
でも、これをやると403エラーが出てしまう。
しかも、アドレスバーのURLがおかしくなってしまった。
https://example.com/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html
なぜこれが起きているのかは不明。
他のリダイレクトは上手く行っているようだった。
ファイル名ではなくフォルダ名のURLなのでそれが問題なのかと思ったら、同様にフォルダ名だけでもちゃんとリダイレクトできているのが多数あり、それが違うのだけはわかった。
Redirect permanent /ccccccc https://example.com/ddddddd/eeeeeee.html
これはOKだった。
(cccccccフォルダにアクセスされたら、/ddddddd/eeeeeee.htmlに自動転送する)
リダイレクトエラーの原因を探す
リダイレクトの原因がわからないので、とりあえず、htaccessファイルのリダイレクト部分の処理を全部消してみた。
すると、アドレスの異常は出ないものの、やっぱり403エラーが出ていた。
なんで?(;・∀・)
と思ってよくよく考えると、index.html がない場合は、フォルダー内を見れないよう、htaccessファイルで自分で設定したのだった。
# indexファイルの無しは非表示
DirectoryIndex index.htm index.html index.php .ht
そこで、これを切ってから再表示するとフォルダの中が丸見えになり、403エラーは起こらなくなった。
じゃあと言うことで、気を良くして再度先ほどのリダイレクトの設定をしたら、やはり先程と同じエラーが出た。
(何故だあ。ヽ(´Д`;)ノ)
原因はフォルダー名
原因がよくわからぬまま、さらにツラツラと考えるうちに、どうやらフォルダー名がリダイレクト元とリダイレクト先で同じであることが原因ではなかろうかと思った。
ページA
https://example.com/aaaaaaa/
ページB
https://example.com/aaaaaaa/bbbbbbb.html
ページAとページBは https://example.com/aaaaaaa/ まで同じ。
そこで、試しに https://example.com/aaaaaaa/ を https://example.com/xxxxxxx/yyyyyyyy.html にリダイレクトしてみた。
すると、リダイレクトは成功した。
でも、それならこう言うタイプのリダイレクトはできなくなってしまう。
そこでちょっとの間考えると、良い方法を思いついた。
https://example.com/aaaaaaa/ の中に index.html の空ファイルを用意し、metaタグで https://example.com/aaaaaaa/bbbbbbb.html へ、リダイレクトしてしまえば良いのだ。
<!-- URL=''のURLを転送先のURLに書き換える -->
<head>
<title>************</title>
<meta http-equiv="refresh" content="0;URL='https://******/******/******.html'" />
</head>
と言うわけで早速やってみたら、大成功した。
何故リダイレクトエラーになってしまったのか?
今回の謎のエラーは、どうやら処理がループしてしまったことで起こった事のようだった。
つまり、こう言うことだった。
1. ユーザーのアクセスが発生
ユーザー(ページの閲覧者)が https://example.com/aaaaaaa/ にアクセス
↓
2. Apacheがリダイレクト処理
htaccessの設定があるので、Apache(サーバーに入っているソフト)は https://example.com/aaaaaaa/bbbbbbb.html
にリダイレクトしようとする
(リダイレクトしてやんよ!(`・∀・´))
↓
3. ユーザーが転送元フォルダを通過
Apache は ユーザーを https://example.com/aaaaaaa/bbbbbbb.html へ転送する前に https://example.com/aaaaaaa/
を通過。
(やっぱここは通過しなきゃねー (・∀・ ))
↓
4. Apacheが再リダイレクト処理をする
htaccessの設定があるので、Apacheはユーザーを https://example.com/aaaaaaa/bbbbbbb.html に
さらに自動転送しようとする
(リダイレクトしてやんよ!(`・∀・´))
↓
5. 以下、3〜4を無限ループ
↓
6. 無限ループに Apache がブチ切れる
同じ処理を何度も繰り返させるんじゃねえ!ヽ( ・∀・)ノ┌┛ゲシッΣ)`Д゚)・;'
↓
7. Apache が 403エラーを吐き出して停止させる
無限ループとかやってらんねえんだよ!(=`ω´=)
↓
8. アドレスが異常になり、403エラーが出る
とりあえずApacheが頑張った証として、アドレスが異常なことになる
https://example.com/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html/aaaaaaa/bbbbbbb.html
そこで、<head></head>内にMETAタグでリダイレクトする方法に切り替えると、このように変わった。
1. ユーザーのアクセスが発生
ユーザー(ページの閲覧者)が https://example.com/aaaaaaa/ にアクセス
↓
2. ファイル内のMETAタグでリダイレクト発生
Apacheは https://example.com/aaaaaaa/index.html のMETAタグの指定でリダイレクト処理を行う。
(リダイレクトしてやんよ!(`・∀・´))
↓
3. Apacheは指定のファイルへユーザーを転送する
ユーザーは https://example.com/aaaaaaa/bbbbbbb.html へ転送される
この方法を行うとApacheのリダイレクトの処理による無限ループは起きないが、空の index.html(index.php)を設置してやる必要があるので、無駄なファイルが増えてしまう点が難点だ。
(Googleからあらぬスパム扱いを受けてしまう可能性もあり、その点も問題)
そのようなわけで、そのリンク切れのリンクからやってくるお客が居ない場合は、この方法でのリダイレクトはしない方が無難だと思う。
(今回はポツポツとこのリンクを辿ってやってくるお客がいるようだったので、仕方なくこの方法でリダイレクトを行った)
広告