404エラーページをカスタマイズして,移転元URLから新URLへの誘導を行う

中継ページ方式によるURL転送作業

 このカモランドは,フレッツADSLでインターネットに常時接続した自宅PC上で, Webサーバ(Apache)を動かすことで実現しています.

で,この自宅PCに,「http://kamoland.no-ip.com」といったURLでアクセスできるようにするためには, DNS(Domain Name Service)サーバと呼ばれるマシンに,URLとIPアドレスの対応関係を登録しておく必要があります.

私はこれまで,DynDNSというサービスが提供しているDNSサーバを使っていて,

  • http://kamoland.homeip.net

というURLでここにアクセスできるようにしていました.

しかし都合により今後は,

  • http://kamoland.no-ip.com

というURLを,No-IP.comというサービスが提供しているDNSサーバに登録することにしました. *1

そのため,これまで

  • (旧) http://kamoland.homeip.net

というURLでアクセスしてくれていた人々を,

  • (新) http://kamoland.no-ip.com

というURLに誘導するということが必要になってしまいました. まぁ,よくありそうな話ですわ.

今回,何とかスムーズに誘導できないかなあ,と色々Apacheの設定を工夫して試してみたので, その顛末を書いてみます.


方針

アクセスしたURL表示されるページ
http://kamoland.homeip.net/「移転しました」として,新URLを表示する
http://kamoland.homeip.net/???.html「ページはありません」としてトップページの新URLを表示

こんな感じです.トップページがアクセスされたときは別に問題ないのですが, 配下のhtmlファイルを直接アクセスされたときが,少々くせ者です.

ファイル数が膨大なので,いちいちページごとに対応する新しいURLを書いたページを用意してられないので, 404エラーを捕捉することによって,一括で新トップページのURLを表示することにします.


旧URL用トップページの作成

 まず,古いURLでトップページにアクセスしてきた人に見せる,「移転しました」ページを作っときます.

index.html

<HTML><HEAD><TITLE></TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
</HEAD>
<BODY>

<CENTER>
<H2>カモランドは移転しました</H2>
<P>
<H3>
<A HREF="http://kamoland.no-ip.com">http://kamoland.no-ip.com</A>
</H3>
ダイナミックDNSサービスの変更に伴い,URLが変わりました.
<P>
お手数おかけします...
</CENTER>
</BODY></HTML>

404 Not Foundエラーページの作成

 次に,トップページ以外にアクセスしてきたときに表示する,エラーページです.

missing.html

<HTML>
<HEAD>
<TITLE>404 Not Found</TITLE>
<META http-equiv=Content-Type content="text/html; charset=Shift_jis">
</HEAD><BODY>
<H1>Not Found</H1>
要求されたページは,見つからないっす
<P>
トップページ <A HREF="http://kamoland.no-ip.com">http://kamoland.no-ip.com</A>
からリンクをたどってみて下さいませ
<P>
よろしくおねがいします
<HR>
</BODY></HTML>
ここで必ずトップページへのリンクを表示して,何とか見に来た人を繋ぎとめようと努力します.
言わないで〜,さよならは〜♪

VirtualHostの設定

 さて,ここまでをふまえて,Apacheにどのような動きをさせれば良いのか,まとめてみます.

アクセスされたURL表示されるページ
http://kamoland.homeip.net/上記のindex.htmlを表示.「移転しました」
http://kamoland.homeip.net/???.html404エラー.上記のmissing.htmlを表示する
http://kamoland.no-ip.com/本来のカモランドのindex.htmlを表示
http://kamoland.no-ip.com/???.html本来のカモランドのhtmlを表示

という風に,アクセスしたURL(厳密には,HTTP RequestのHost:ヘッダの内容)によって, 表示するURLを切り替えればOKです.

(もちろん,homeip, no-ip 両方のURLが自宅PCのIPアドレスに対応するように, DNSに登録してあることが前提です)

これはApacheでは,ネームベースのVirtualHost機能で実現できます.

httpd.confより抜粋

# 404エラー時の表示ページ
ErrorDocument 404 /missing.html

# ネームベースのVirtualHost
NameVirtualHost kamoland.no-ip.com

# 旧URLでのアクセス時は,移転案内
<VirtualHost kamoland.no-ip.com>
    ServerName kamoland.homeip.net
    DocumentRoot /moved
    ErrorLog logs/moved-error_log
    CustomLog logs/moved-access_log combined
</VirtualHost>

# 新URLでのアクセス時は,本来のカモランド
<VirtualHost kamoland.no-ip.com>
    ServerName kamoland.no-ip.com
    DocumentRoot /html
    ErrorLog logs/error_log
    CustomLog logs/access_log combined
</VirtualHost>

例えば,httpd.confにこのように記述しておいて,

  • /moved 配下には,上記の「移転しました」index.htmlと,missing.html
  • /html 配下には,本来のカモランドのhtmlファイル群と,missing.html

を配置すれば,目的を達成できます.

 しかし,わざわざクリックするのが面倒だなぁということで, URLリライト方式によるURL転送作業 を試してみます.


*1 正確にはDNSに登録するのはURLではなく,ホスト名なのですが,ここではイメージで書いています


© 2023 KMIソフトウェア