移転先へのリンクを生成する ErrorDocument を作る

えーと,というわけで [2007-05-04]旧ドメインは更新を停止し,さらにコンテンツもばっさり消してしまいました.古いほうの RSS にアクセスしている方,大丈夫ですかね.とか書いても「いない人いますかー」みたいな虚しさが残るな.



さて,旧ドメインのコンテンツを消す際,移転先 (このドメイン) へのリンク (「○○に移転しました」云々) を残しておきたいと思った.ページ数が少なければ,各ページに移転先を書いておくという古典的な方法でいける.問題はこのブログだ.Permalink だけで膨大な量があるし,クエリ入り URL まで含めたらお手上げだ.単にまとめてブログのトップページに飛ばす手もあるけど,それはちょっと不親切というものだ.



つーわけで,ErrorDocument を活用してやることにした.たぶん,よくやられてる方法なんだと思うし,もっと洗練された方法があったりするかも知れないけど.



まず .htaccess

ErrorDocument 404 /file_not_found.cgi

と書いておく.これで,存在しないページにアクセスがあったら 404 を返して file_not_found.cgi にリダイレクトする.

file_not_found.cgi は以下のようになっている (実際に使っているものには英語の注意書きも載っている).

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
print "<html><head>\n";
print "<title>Moved</title>";
print "<META http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-jp\">";
print "<link rel=stylesheet type=\"text/css\" href=\"http://nao.s164.xrea.com/hoge.css\"><STYLE TYPE=\"text/css\">@import url(http://nao.s164.xrea.com/hoge.css);</STYLE>";
print "</head><body>\n";
$uri = $ENV{'REQUEST_URI'};
$oldsvr = $ENV{'SERVER_NAME'};
$newsvr = "nao.s164.xrea.com";
print << "HEADER";
<h2>このコンテンツは以下に移転しました</h2>
http://$oldsvr$uri<br>
は<br>
<a href="http://$newsvr$uri">http://$newsvr$uri</a><br>
に移転しました.
<p>
<a href="http://$newsvr">Top Page</a>
<hr>
<address>nao(at)s164.xrea.com</address>
HEADER
print "</body></html>\n";

つまり REQUEST_URI で移転先を生成しているというわけだ.難点は,本当にもともと存在しない URI を指定されてもリンク先を生成してしまうという点だけど,まあそれはほっとけばいいかな(ぉ



HEAD -S で確認したらちゃんと 404 が返っていることがわかったので,bot ももう来なくなるだろう.