今回のTipsは『サイトを移転した後も、旧URLが生きている限りは移転先の更新情報をはてなアンテナに捕捉して貰い続ける方法』です。はてなアンテナの更新チェッカーを新URLに転送させて更新情報を取得させつつ、この更新チェッカーが新URLにアクセスした時にだけ捕捉URLの修正を促すメッセージを新着情報に併記させたり、はてなアンテナから旧URLにアクセスした人にだけ移転告知を表示したりさせちゃいます。あ、もちろんアンテナによる更新捕捉だけでなく、通常のブラウジングでも新URLに転送出来ますので、はてなアンテナ対策に興味の無い方もどうぞ。一応、はてなアンテナを持っていない方の為に簡単な概要も書きました。
また、今回紹介する方法で新URLに転送させると、移転告知ページから誘導する場合と違って(Google等の)検索エンジンがスムーズに登録情報を更新出来る、というメリットも有ります。
なお、今回のTipsも私自身が諸々のリファレンス等を参考にしつつ適当に遊んでいて得た結果なので、適当且ついい加減極まりなく、何らかの瑕疵が含まれている可能性も有りますので、ご利用は自己責任でお願いします。最悪、設定を間違えればサーバが自分自身への転送を繰り返す(自分自身を呼んだ自分が自分を呼んで以下略)無限ループでサーバダウンという事態も……
おまけは、移転したにも関わらず旧URLのCGIに投稿をしようと試みている熱心なスパム業者に対して、普段お目にかかる事の無い希少で微笑ましいエラー画面をプレゼントしちゃう企画ですw エラー404や403は、もう古い!長くなりすぎたので次回に持ち越しです。
今回は、Apacheにmod_rewriteモジュールがインストールされており、htaccessが利用でき、PHPスクリプトが動かせる環境が必要です。例によって、以上の環境が用意出来ない場合は他の方法で賄うか、気合いで何とかして下さい。
お気に入りサイトの更新情報を拾ってくれる”はてなアンテナ”は当サイトも何名かの方に捕捉して頂いており、私自身も”かにみそあんてな”として活用させて頂いている大変便利なサービスです。
この、はてなアンテナに予めお気に入りサイトを登録しておくと、そのサイトが更新された時に一目で判るので、手動で大量のお気に入りサイトの更新をチェックする手間が省けるようになります。また、エイプリルフールなどの賞味期限が短い季節ネタも見逃すことなく目撃出来るでしょうし、お気に入りサイトが移転した際も(移転前のサイトに移転告知が有ればですが)すぐに捕捉出来るので、気が付いたらサイトに繋がらなくなっていた!なんて事も避けられるかも知れません。
一言にはてなアンテナと言っても、特に公開もせずに個人で利用しているようなアンテナから、多くの人が利用する大規模なアンテナまで様々なものがあります。基本利用は無料なので、興味が有れば誰でもはてなアンテナを持てます。
そんな便利なはてなアンテナですが、更新情報を取得したいサイトのURLを登録しても、そのサイトが移転してしまったら、もう一度移転先のURLを登録しない限り、更新をチェック出来なくなってしまいます……それは、更新情報を求めている人は勿論、捕捉されている側のサイト管理人としても由々しき事態です!(大袈裟
更新情報が配信されないという事は、見に来てくれる人の数に直接影響します。アンテナのオーナーさんが移転に気が付いて新しいURLを登録してくれれば万々歳ですが、人には都合や事情が有ります。アンテナに捕捉された移転告知も、時と共に他のサイトの更新情報に埋もれてしまいます……当サイトのように、移転やディレクトリ構造の変更を複数回行っていると、その度に捕捉して頂いているアンテナが減っていきます(正確には、こちらが振り落としてしまったとも言えます……)
どうせサイトを運営するなら、出来るだけ沢山の人に観て貰いたいと思うのが人情と云うもの。 そこで今回のTipsは、『サイトを移転した後も、旧URLが生きている限りは移転先の更新情報をはてなアンテナに捕捉して貰い続ける方法』です。
旧いサイトのルートディレクトリ(例:/home/hogehoge/www/)に下記の.htaccessファイルを設置します。なお、#の付いてる行はコメントなので、削除しても大丈夫です。
# 旧サイトにアクセスされた時に表示する移転告知ファイルを指定。
DirectoryIndex remove.php
# 転送処理開始。
RewriteEngine on
# URLに”.hatena.ne.jp”が含まれるサイトからアクセスが有ったら転送しない。
RewriteCond %{HTTP_REFERER} !.*\.hatena.ne.jp
# ”ent.css”というファイルにアクセスされても、転送先に取りに行かない。
<Files ent.css>
RewriteRule (.*) $1 [L]
</Files>
# それ以外のアクセスは、全て新サイトに転送。
RewriteRule ^(.*)$ http://yumimu\.jp/$1 [R=301,L]
最初にある
DirectoryIndex
は、ホームページ(このサイトならhttp://yumimu.jp/)にアクセスされた時に表示するファイルを指定しています。この指定が無い場合はindex.html・index.htm・index.phpなどのサーバがデフォルトで指定しているファイルを探しに行きます。何らかの事情で旧サイトのindex.htmlを移転告知として書き換えたくない場合には、ここで移転告知のremove.phpが表示されるように設定します。index.htmlなどをそのまま移転告知に書き換えるのであれば、この行は要りません。
次の
RewriteEngine on
で転送処理を開始します。もし、旧いサイトの中でアクセスされても転送させたくないディレクトリがある時は、そのディレクトリに
RewriteEngine off
と書いた.htaccessを設置しておけば転送されません。
次の
RewriteCond %{HTTP_REFERER} !.*\.hatena.ne.jp
では、新URLへの転送から除外したいアクセス元を指定しています。今回の目的である「はてなアンテナに新URLの更新情報を拾ってもらいつつも、アンテナのオーナーにさり気なく移転をアピールしたい」というチキンで贅沢で姑息な願いを叶えてくれるかも知れない重要な部分です。.hatena.ne.jpという文字が含まれたURLからアクセスされた場合だけ、新URLに転送させずに移転告知を表示します。
次の
<Files ○○.hoge>
から
</Files>
までの記述で、アクセスが有っても転送させたくないファイルを指定し、
RewriteRule (.*) $1 [L]
で転送処理を停止させます。例えば、移転告知ページで外部のCSS(スタイルシート)を読み込んでいる場合などに、ここで指定しておかないと、ブラウザは移転先のURLにCSSを探しに行く事になります。逆に言えば、移転先に告知用のCSSを置いておけば、この記述は必要有りません。
最後の
RewriteRule ^(.*)$ http://○○.hoge/$1 [R=301,L]
に有る
^(.*)$
の部分でアクセスされたディレクトリ名やファイル名を受け取った上で、「それはhttp://○○.hoge/に移転したよ」と通知するステータスコード(301 MovedPermanently)を返す事で、それを受け取ったブラウザや検索エンジンロボットは(大概は自動的に)移転先に向かいます。この転送方法の優れている点は、要求されたURLを読み取って、移転先のURLにリダイレクトしてくれるという事です。例えば、”http://www.aomusi.ru/links/friend.html”にアクセスされると”links/friend.html”という部分を分解して、移転先の新しいURL”http://kanimiso.tw/links/friend.html”に転送してくれますので、旧いサイトに有るファイルの全てに新URLにリダイレクトさせるMETAタグを書く、という気の遠くなるような作業をしなくて済みます。
次に、リダイレクトで移転先に飛んで来たはてなアンテナのロボットに対してだけ移転告知を拾わせるPHPスクリプトを用意します。
<?php
if (ereg("Hatena Antenna" , $_SERVER["HTTP_USER_AGENT"] )){
echo "<p>はてなアンテナをお使いの方へ</p>\n";
echo "<p>ディレクトリ構造を変更しました。お手数ですがアンテナの捕捉先を変更して下さい。</p>\n";
}
?>
アクセスしてきたユーザーエージェントがはてなアンテナのものであったらメッセージを表示する単純なスクリプトです。これを普段公開している日記の上や更新履歴の上に置いておけば、はてなアンテナのロボットがメッセージを取得して、新着更新情報としてはてなアンテナに捕捉されます。なお、一度更新情報としてスクリプトのメッセージが取得されると、メッセージを書き換えない限り次の新着情報として拾って貰えませんのでご注意を。
これで、移転先の更新情報を拾わせつつ、アンテナのオーナーに移転した旨を伝えられると思います。一応、断っておきますが、旧いサーバが稼働している間しかリダイレクトは動作しないので、(レンタルしているのなら)サーバの契約期間が切れる前にアンテナの捕捉先修正と、検索エンジンの登録情報更新を期待しなくてはならないので、せめて数週間程度の余裕を持った移転計画が必要でしょう。後はアンテナのオーナーに修正の意志が有るか無いかです(・∀・)
判りやすいようにと心がけて書いていたら、かなり長くなってしまったので、おまけは次回に。

今のところ上手く機能しているようです。
このエントリーのトラックバックURL:
http://yumimu.jp/cgi-bin/mt/mt-tb.cgi/29