カモランドではリダイレクトCGIを使って短縮URLを実装しています
はじめにカモランドの短縮URLは,例えば以下のような動きをします.
これは 2.のページに対して,「pyukiwiki-cache.html」 という短縮URLを与えているという状況なのですが, 実際にカモランドでこれを実現している方法について,説明します.
短縮URLの実現方法以下の2段構えで行っています.
1.Apacheの設定短縮URLは普通のHTMLのURLに見せかけているので, どうしてもApacheの助けが必要.Apacheのmod_rewriteを設定して,/alias/〜へのリクエストをリダイレクト用CGI(view.cgi)にリライトする. httpd.confより抜粋 RewriteEngine on RewriteRule ^/alias/(.*) /wiki/view.cgi?$1 [PT] 2.リダイレクトCGI上述のApacheの設定で,http://kamoland.com/alias/pyukiwiki-cache.htmlへのリクエストが, http://kamoland.com/wiki/view.cgi?pyukiwiki-cache.htmlへのリクエストにリライトされるようになった. そこでこのview.cgiで,最終的な目的ページへのリダイレクトを行う. view.cgi #!/usr/bin/perl use strict; my $dbfile = '/var/www/alias.txt'; my $query = $ENV{'QUERY_STRING'}; my $url = $query; $url =~ s/\///g; my $new_url = `grep $url $dbfile`; $new_url = (split(/ /, $new_url))[1]; print "Location: $new_url\n\n"; とは言え,grepでやってることは単純なので,grepを呼び出している箇所は簡単にperlに書き直せると思います. $dbfileという名前のファイルをオープンして,$urlを含む行を検索すれば良いだけです. $urlはview.cgiに渡されたパラメータ(=短縮URL.例えばpyukiwiki-cache.html)ですが, それに対応する完全なURLを$dbfile(=alias.txt)から探し, その完全URLへのLocationヘッダを最後に出力して終わりです. CGIでこのようにLocationヘッダを出力すれば, HTTPのステータスコードはApacheが良きに計らってくれる. 実際には以下のようなレスポンスが得られた. HTTP/1.0 302 Found Date: Fri, 18 May 2007 14:35:08 GMT Server: Apache Location: http://kamoland.com/wiki/wiki.cgi?PyukiWiki%a4%cb%a5%ad%a5%e3%a5%c3%a5%b7%a5%e5%b5%a1%c7%bd%a4%f2%a4%c4%a4%b1%a4%eb Content-Length: 299 Connection: close Content-Type: text/html; charset=iso-8859-1 短縮URLと完全URLの対応付けを保持しているalias.txtは,以下のような内容だ. /var/www/alias.txtより抜粋 pyukiwiki-cache.html http://kamoland.com/wiki/wiki.cgi?PyukiWiki%a4%cb%a5%ad%a5%e3%a5%c3%a5%b7%a5%e5%b5%a1%c7%bd%a4%f2%a4%c4%a4%b1%a4%eb url_alias-impl.html http://kamoland.com/wiki/wiki.cgi?%c3%bb%bd%ccURL%a4%ce%bc%c2%c1%f5 メンテナンスリダイレクトしたいページを追加するときは,alias.txtに行を追加すれば良い. 簡単だ.301リダイレクトへの変更 (2009.03.01)その後,対GoogleBotで問題があったので,以下のように302から301リダイレクトに変更しました.view.cgi [変更前] print "Location: $new_url\n\n"; ----------------------- [変更後] print "Status: 301 Moved Permanently\n"; # ←追加 print "Location: $new_url\n\n"; |