カモランドではリダイレクトCGIを使って短縮URLを実装しています

はじめに

カモランドの短縮URLは,例えば以下のような動きをします.
  1. http://kamoland.com/alias/pyukiwiki-cache.html をブラウザで開くと,
  2. http://kamoland.com/wiki/wiki.cgi?PyukiWiki%a4%cb%a5%ad%a5%e3%a5%c3〜 が開く

これは 2.のページに対して,「pyukiwiki-cache.html」 という短縮URLを与えているという状況なのですが, 実際にカモランドでこれを実現している方法について,説明します.

  • Apache 2.2.4

短縮URLの実現方法

以下の2段構えで行っています.
  1. Apacheで,短縮URL(html)をcgiへのリクエストにリライトする
  2. cgiで短縮URLに対応する完全URLを検索し,そのURLへのリダイレクト応答を返す

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";
凶悪なことに内部でOSのgrepコマンドを呼び出しているので, LinuxなどUnix系でないと動かないと思います.

とは言え,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
ステータスは「302 Found」ですな.(俺はてっきり302は,Moved Temporarilyだと思っていた...)

短縮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";


© 2024 KMIソフトウェア