htaccessのWarner(罠)にアクセス苦闘(悪戦苦闘)

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
久しぶりにダサいタイトル来ましたね。

え? いつもダサい?


止めようぜ。そういうのは心の中にそっとしまって南京錠を掛けておこうぜ。


よくサイトを移転した際、「新しいサイトはこちら」「10秒後に自動でジャンプします」的なペラ1のページを用意することってあるじゃないですか。

んで、そのサイトのどのページにアクセスしてきても、とりあえずそのジャンプしますの案内が出てるページにリダイレクトさせると、そういうサイトって時々見かけるじゃないですか。

僕もゆえあってそんなような作業を任されることになりましてね。とりあえずそういうのはhtaccessで設定すりゃ何とかなんだろ、10分もありゃ楽勝よ、とか思ってたんですけど、やってみたら案外上手くいかなかった。

まあ、何だかんだで、普段htaccessってあまりいじらないですからね。エッチなサイトにアクセスしていじる回数に比べたら圧倒的に少ないですからね。意外と分からなかった。



Warner(罠)

いや、理論的には分かってたんですよ。要はどのページにアクセスしても指定のページにリダイレクトする処理を書けばええやん? って、概念は分かってたんですよ。

で、いろんなサイトを巡回して調べてみたんですが、htaccessで常にトップページにアクセスするように設定する方法を載せているサイトは結構ありました。

大体のサイトに共通して書かれていたのは、RedirectMatchを使うことですね。

RedirectMatch (.*) http://norm-nois.com/

みたいなね。

RedirectMatchっていうのは、正規表現を使ったリダイレクト方法ですね。正規表現に引っかかるURLにアクセスされたとき、上記の場合でいえばhttp://norm-nois.comにリダイレクトされると、そんな感じです。(.*)ってのは、一言で言えば任意の文字なら何でも引っかかるってことですね。

これだと、サイト内のどんなURLだろうと、とりあえずhttp://norm-nois.comにリダイレクトすると、まあそう言いたいわけです。

何だ、簡単だなぁと思う反面、でもこれだと全てのURLが引っかかるんだから、トップページ自身も引っかかっちゃうんじゃね? と思わなくもなかったんです。


まさにその通りの結果になりました。

この一文だけじゃ足りなかったのか、実はこの一行の前にリファラとかを判定しているような文があって、でもそんなのはあまりにも一般常識過ぎるから書かれていなかっただけとか、そんな感じだったのかもしれませんが、とりあえず僕がやった限りでは、無限ループにはまったようでした。



特定のURLだけ除外する

この方法がダメとなると、比較的誰もが辿り着くであろう次の結論は、「特定のURL以外のときはその特定のURLにリダイレクトする」ってやつだと思うんですよ。僕はまさにそうでした。

だから例えばjump.htmlみたいなのを用意して、このサイトだったらhttp://norm-nois.com/jump.html以外にアクセスされた場合は、自動的にそこに飛ぶように設定できれば問題は解決するわけですね。

ただ一つ弱点があって、俺、正規表現苦手なんですよね。

何だよ正規って。俺や亜城木先生みたいな王道より邪道派のやつに正規とか理解できるわけないやん。性器のことなら一日の八割くらいは考えてますけどねぇ。


正規表現には否定がありますよね。よくテキストボックスに数字以外の入力を禁止する場合とかに使ったりすると思うんですけど。

[^0-9]

これは数字以外の文字が一文字でも入っているとマッチします。つまりこれにマッチした場合、その文には数字以外の文字が含まれているってことですね。

正規表現の細かい説明とかは僕もできないんで、詳しく知りたい方はこのへんとか参考にすると良いと思います。僕もよくお世話になってます。

あとこのサイトにもよくお世話になってます。主に下の方が。

RedirectMatch [^jump.html] http://norm-nois.com/jump.html

こう書いた場合、「j」「u」「m」「p」「.」「h」「t」「m」「l」以外の文字が一文字でも入っていたら、条件に該当するわけです。逆にいえば、この文字だけで構成されたものなら、条件には該当しないってことですね。だからjump.htmlはマッチしないので、リダイレクトされないと。

だから早い話、jump.htmlでもマッチはしないのですが、j.htmlでもマッチはしないわけですね。だから本当は、あまり良い書き方ではないのかもしれない。


理論的にはこれで合ってるはずなんですが、でもいざやってみたらなぜかダメだった。jump.htmlのときもなぜかリダイレクトされてた。



んで、結局

結論からいうと、以下の書き方で解決しました。

RidirectMatch [^(jump.html)] http://norm-nois.com/jump.html

何でこっちの書き方じゃないとダメなのかってとこまでは調べてないので分かりませんが、案外俺がスペルミスしてただけかもしれないし、でもとりあえず処理は上手くいきました。

あとカッコつけることで何が変わるのかがいまいちよく分かりませんでした。カッコで括ることでjump.htmlを一つのまとまりとして扱ってくれんのかなぁとか思ったんですけど、相変わらずj.htmlとかでもマッチしないし、よく分かりません。



今日の結論としては、やっぱり正規表現はよく分かりませんってことですね。

難しいこと考えるのもめんどくさいし、今日はもう、性器表現されてるサイトにアクセスしますわ。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください